Nextflow DSL2同一模块内复用流程并自定义输出名称的方法
解决方案:使用
include为流程创建别名 在Nextflow DSL2中,同一个流程在同一工作流上下文无法直接重复调用,你遇到的报错正是源于这个机制。要轻量复用同一流程,无需新建模块或重写流程代码,只需用include语句在当前模块内为目标流程创建一个别名即可。
修改后的代码示例
process ReUsable { publishDir "${params.publish_dir}/VF/SZ/${meta}", mode: 'copy', pattern: '*.out' container 'bla.1' input: tuple val(meta), path(input) output: tuple val(meta), path('one.out'), emit: out1 script: """ cat ${input} > one.out """ } # 为ReUsable流程创建别名ReUsable2,导入当前模块自身 include { ReUsable as ReUsable2 } from './' process ScndStep { publishDir "${params.publish_dir}/VF/${meta}", mode: 'copy', pattern: '*sub.out' container 'bla.2' input: tuple val(meta), path(out1) output: tuple val(meta), path('two.out'), emit: out2 script: """ sed -i "s/i/o/g" ${out1} > two.out """ } workflow Unite { take: input main: out1 = ReUsable(input) out2 = ScndStep(out1) # 使用别名调用复用的流程 out3 = ReUsable2(out2) emit: out1 out2 out3 }
关键说明
include { ReUsable as ReUsable2 } from './':这条语句从当前目录(即自身模块)导入ReUsable流程,并将其重命名为ReUsable2,相当于创建了一个原流程的“引用副本”,完全复用原流程的所有定义,无需修改或重复编写代码。- 工作流中第一次调用原流程
ReUsable,第二次调用别名后的ReUsable2,二者共享同一流程逻辑,但在Nextflow的上下文里被视为两个独立的流程实例,不会触发重复使用的报错。
另外,原代码中.SaveAs{three.out}的写法不符合Nextflow语法,已移除。如果需要修改输出文件的命名,可以调整ReUsable流程的输出路径定义,或者在publishDir中通过参数动态控制。
内容的提问来源于stack exchange,提问作者Ulf90
相关产品推荐
相关产品推荐

