You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:42:38