第2章 环境搭建:依赖、安装与首个流程

搭建 Nextflow 环境这事儿,说简单也简单,说坑也多。我第一次装的时候就被 Java 版本折腾了半小时——后来发现只是缺了个环境变量。这一章我带你从头捋一遍,从 JDK 到 Nextflow 跑通 Hello World,每一步都给出实操命令和避坑经验。

2.1 环境全景概览

先把需要的组件理清楚。你只需要三样东西:JDK、Nextflow 本体、容器或集群平台(可选,但强烈建议装个 Docker)。下面这张表列出各组件的角色和最低版本:

组件 版本要求 作用
JDK(Java Development Kit) 11 及以上(推荐 17 LTS) 运行 Groovy 编译后的字节码
Nextflow 22.04+(推荐最新稳定版) 工作流引擎本体
Docker / Singularity 最新稳定版 容器化执行环境
Conda / Pip 与系统匹配 可选安装方式

整个搭建流程其实就五步,走完就能跑 Hello World。我画了张流程图,你看一眼就能记住全貌:

Nextflow 环境搭建全流程 系统环境(Linux / macOS / WSL) JDK 11+(Java 运行时) 安装方式:手动 / Conda / Pip 版本管理(稳定版 / 开发版) Hello World 流程验证 ⚠ 提示: 每次安装后执行 nextflow info 确认版本,避免版本不匹配。

2.2 Java / Groovy 依赖

Nextflow 是用 Groovy 写的,Groovy 又跑在 JVM 上。所以 JDK 是硬前提,没有它什么都干不了。

安装 OpenJDK 17 LTS(我建议用这个版本,踩坑最少):

# Ubuntu / Debian
sudo apt update
sudo apt install openjdk-17-jdk -y

# macOS (Homebrew)
brew install openjdk@17

# 验证安装
java -version

输出应该类似这样:

openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-122.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-122.04, mixed mode)
环境变量别漏了。 我曾经帮同事排查过一个问题——明明装了 JDK,Nextflow 却说找不到 Java。结果就是 JAVA_HOME 没设。加上这行:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
然后 source ~/.bashrc 刷新一下。

Groovy 不需要单独装。Nextflow 自带了 Groovy 编译器,你只要把 JDK 配好就行。说白了,JVM 才是它真正的家。

2.3 Nextflow 安装三选一

Nextflow 官方给了三种安装方式。我三种都用过,各有利弊。下面这张表帮你快速决策:

方式 命令 适用场景
手动安装(官方推荐) curl -fsSL get.nextflow.io | bash 服务器、生产环境
Conda conda install -c bioconda nextflow 已有 Conda 环境的用户
Pip pip install nextflow Python 生态用户(实验性)

方式一:手动安装

这是最正统的方式,我推荐你优先用。它不依赖任何包管理器,拿到的是一个独立的可执行文件。

# 下载并安装
curl -fsSL https://get.nextflow.io | bash

# 移到 PATH 目录
sudo mv nextflow /usr/local/bin/

# 验证
nextflow -version
小技巧: 手动安装后,nextflow 就是一个单文件。你拷贝到其他机器上也能用。我经常用这个特性在集群上快速部署,省去联网安装的麻烦。

方式二:Conda 安装

如果你已经在用 Conda 管理生物信息学工具,这步就特别顺滑。我个人习惯用 Conda 做环境隔离,避免不同项目之间的依赖冲突。

# 创建一个干净的环境
conda create -n nf-env -c bioconda nextflow

# 激活环境
conda activate nf-env

# 验证
nextflow -version

方式三:Pip 安装

Pip 方式目前还是实验性的,但胜在方便。你想想看,一条命令就能装好:

pip install nextflow

# 验证
nextflow -version
注意: Pip 安装的版本可能比官方渠道慢几周。如果遇到奇怪的问题,先换成手动安装看看能不能复现。我在一次培训中就遇到过 Pip 版跑官方示例报错,换成手动版就好了。

2.4 版本管理

Nextflow 版本更迭挺快的,学会管理版本能省去很多麻烦。官方提供了一条 nextflow self-update 命令,但真正灵活的方式是用 NXF_VER 环境变量切换版本。

查看当前版本:

nextflow -version

使用特定版本运行流程:

# 临时指定版本(不修改已安装的版本)
NXF_VER=22.04.0 nextflow run hello

# 永久切换(写入配置文件)
echo "export NXF_VER=23.04.0" >> ~/.bashrc
source ~/.bashrc

更新到最新稳定版:

nextflow self-update

安装开发版(edge 版本):

# 手动下载 edge 版本
curl -fsSL https://code.nextflow.io | bash

我为什么强调版本管理? 有一次我在生产流程中使用了新版本的语法特性,但同事的环境还是旧版本,导致流程启动失败。从那以后,我每个项目都在 nextflow.config 里固定 nextflow.version,确保团队统一。

2.5 Hello World 首个流程

环境搭好了,来跑个真正的流程吧。我们不搞花哨的,就用 Nextflow 官方最经典的 Hello World 示例,验证整个链路是否通畅。

创建一个文件 hello.nf:

#!/usr/bin/env nextflow

nextflow.enable.dsl=2

params.greeting = "Hello World!"

process sayHello {

    output:
        path "greeting.txt"

    script:
    """
    echo "${params.greeting}" > greeting.txt
    """
}

workflow {
    sayHello()
    def lines = file("greeting.txt").readLines()
    println "流程输出:${lines[0]}"
}

运行它:

nextflow run hello.nf

你应该会看到类似这样的输出:

N E X T F L O W  ~  version 23.10.0
Launching `hello.nf` [pensive_goldberg] DSL2 - revision: 1a2b3c4d5e
executor >  local (1)
[a9/b1c2d3] process > sayHello [100%] 1 of 1 ✔
流程输出:Hello World!

没有 Docker 也能跑。 这个示例用的是本地 executor,不需要容器。你看到 executor > local 就说明一切在本机执行。不过在实际项目中,我建议尽早配上 Docker 或 Singularity,保证可复现性。

跑通这一步,说明你的 JDK 环境、Nextflow 安装、文件系统权限全部正常。嗯,恭喜,你已经入了 Nextflow 的门了。