构建Nextflow DSL2 BLAST流程遇变量错误,需添加workflow语句
问题解决:Nextflow DSL2 BLAST流程参数失效及变量报错
错误原因
- DSL2 要求必须通过
workflow {}块显式启动进程,原代码缺少该块导致进程未执行,同时引发参数作用域解析异常。 - 直接在进程脚本中引用
$params.query存在作用域问题,触发「No such variable: query」报错。
修改后的完整代码
#!/usr/bin/env nextflow nextflow.enable.dsl=2 // 参数配置移至开头,避免作用域问题 params { query = "$PWD/input.fasta" dbDir = "$PWD/DB/" dbName = "blastDB" threads = 2 outdir = "out_dir" } println "\nI want to BLAST $params.query to $params.dbDir/$params.dbName using $params.threads CPUs and output it to $params.outdir\n" process runBlast { // 将结果发布到指定输出目录 publishDir "$params.outdir", mode: 'copy' input: // 通过输入通道传递查询文件,规范处理文件路径 path query_file from params.query script: """ blastn -num_threads ${params.threads} -db ${params.dbDir}/${params.dbName} -query ${query_file} -outfmt 6 -out input.blastout """ } // 新增workflow块,启动BLAST进程 workflow { runBlast() }
关键修改说明
- 添加
workflow {}块:DSL2 中进程不会自动运行,必须在该块内调用进程(如runBlast())触发执行。 - 调整参数引用方式:通过
input通道将params.query作为文件传入进程,避免直接引用params的作用域问题,同时符合 Nextflow 数据流范式。 - 新增
publishDir:将进程生成的结果文件自动复制到指定的outdir,实现结果持久化。 - 调整
params位置:移至脚本开头,符合 Nextflow 常规写法,避免参数加载顺序问题。
验证命令行参数
使用以下命令传入自定义参数,参数将正确覆盖默认值:
nextflow run main.nf --query /path/to/custom/query.fasta --threads 4 --outdir custom_out
内容的提问来源于stack exchange,提问作者Eesha Bhatkhande
相关产品推荐
相关产品推荐

