Nextflow 安装与配置(本地)

说实话,刚开始接触 Nextflow 时,我以为装个工具而已,随便 pip 一下就行。结果第一次跑工作流就报错——模块找不到、Java 版本不匹配、缓存路径全是坑。后来我老老实实把安装配置梳理了一遍,后面再也没出过本地环境的问题。这一节我们就来聊聊本地怎么装、怎么配,让你少走我当年走过的弯路。

为什么不能随便装?

Nextflow 本质是一个 Java 应用,靠 Groovy 脚本驱动。你的系统里缺了 Java、环境变量没设对、或者安装了不兼容的版本,它都会给你脸色看。我见过同事用 apt 装了一个旧版 OpenJDK,结果 Nextflow 直接报 `UnsupportedClassVersionError`。嗯,Java 版本太老,管线跑不起来。

另外,Nextflow 的缓存和会话管理依赖本地文件系统。如果你在共享集群上乱装,可能会和别人写的缓存冲突。所以本地安装,一定要搞清楚两个事:Java 版本 + 缓存路径。

安装方式:选哪个?

官方提供了好几种安装途径。我个人推荐下面这三种,按场景选就好。

方式 命令/操作 适用场景 备注
Conda conda install -c bioconda nextflow 已有 Conda 环境的用户 版本可能滞后几天
手动下载 wget … && chmod +x nextflow 想控制版本、离线安装 需手动加到 PATH
Docker docker pull nextflow/nextflow 容器化开发、CI/CD 环境 适合完全隔离

我自己习惯用手动下载。别觉得麻烦,其实就三步:

# 1. 下载 Nextflow 可执行文件
wget -O nextflow https://github.com/nextflow-io/nextflow/releases/latest/download/nextflow

# 2. 赋予执行权限
chmod +x nextflow

# 3. 放到 PATH 目录下(比如 ~/bin 或 /usr/local/bin)
mv nextflow ~/bin/

小技巧:如果你在 HPC 集群上,没有 root 权限,把 Nextflow 放到自己的 ~/bin 下,然后在 ~/.bashrc 里加一行 export PATH="$HOME/bin:$PATH" 就行。

为什么要手动下载?有一次我需要一个特定的旧版 Nextflow 来复现管线,Conda 里已经没有那个版本了。手动下载可以直接指定 release 的 URL,非常灵活。

前置依赖:Java 到底要哪个版本?

Nextflow 从 22.x 开始要求 Java 11 或更高。Java 8 已经退役了,千万别用。检查你的 Java:

java -version
# 理想输出类似:
# openjdk version "11.0.18" 2023-01-17 LTS

如果版本不对,我建议用 SDKMAN 来管理 Java 版本,干净又方便:

# 安装 SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 安装 Java 11(LTS 版)
sdk install java 11.0.18-tem

我曾经踩过的坑:在 CentOS 7 上用系统自带的 Java 8,Nextflow 能启动但跑工作流时疯狂报错。后来发现官方文档明确写了 Java ≥11。所以别心存侥幸,先把 Java 升上去。

环境变量:配置 NF_HOME 与缓存路径

Nextflow 默认会把工作文件、缓存、临时文件都丢到 $HOME/.nextflow 下。如果你有大量大文件管线,很容易把 home 分区撑爆。我建议手动设置 NXF_HOME 到一个独立的大盘上。

在 ~/.bashrc 或 ~/.bash_profile 里加入:

export NXF_HOME=/data/nextflow
export NXF_OPTS="-Xms1g -Xmx4g"
  • NXF_HOME:指定 Nextflow 的缓存、会话、历史目录。
  • NXF_OPTS:JVM 参数。我个人给 4GB 堆内存,默认 1GB 跑大管线时容易 OOM。

提示:如果你用 Docker 或 Singularity 作为执行器,Nextflow 会自动拉取镜像,这些镜像也会占用空间。记得定期清理 $NXF_HOME/cache 下的无用容器层。

验证安装:一个最简单的 Hello World

装好之后,跑一下自带的 hello 样例,确认整条链路通顺。

nextflow run hello -with-docker

如果你没装 Docker,也可以不加 -with-docker,直接本地跑:

nextflow run hello

输出大概长这样:

N E X T F L O W  ~  version 23.10.0
Launching `hello` [kickass_roentgen] DSL2 - revision: 93f08a64a4
executor >  local (4)
[4f/c3eb00] process > sayHello (4) [100%] 4 of 4 ✔
Bonjour world!
Hola world!
Ciao world!
Hello world!

看到这些问候语,说明安装配置全对了。如果你遇到 `java.lang.OutOfMemoryError`,要么是 Java 堆太小,要么是 NXF_OPTS 没生效。

本章知识结构

下面这张图帮你快速理清整个安装配置的流程关系。别怕,就四个盒子。

Nextflow 本地安装配置流程 检查 Java ≥11 安装 Nextflow 配置 NXF_HOME 验证运行 hello 💡 关键备忘 Java 版本不足或 NXF_HOME 未设置,是本地配置失败的两大主因。

说白了,就四个步骤,按要求一步一步来就不会出错。如果你后续要用 GitLab CI 自动部署,本地配置正确是第一步——因为 CI runner 本质上也是在本地执行这些配置。