第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。我画了张流程图,你看一眼就能记住全貌:
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)
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
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 的门了。