Modules
在大多数编程语言都有创建代码模块这个概念,以便重用代码。
Nextflow (DSL2)允许定义可以跨workflow管道包含和共享的module
脚本。
模块文件只不过是一个 Nextflow 脚本,其中包含一个或多个可以从另一个 Nextflow 脚本导入的进程定义。例如:
process INDEX {
input:
path transcriptome
output:
path 'index'
script:
"""
salmon index --threads $task.cpus -t $transcriptome -i index
"""
}
上面这个INDEX
process被保存在modules/rnaseq-tasks.nf
中作为一个模块脚本。
导入模块
和cpp一样,可以使用关键字include
来导入其他模块。例如:
nextflow.enable.dsl=2
include { INDEX } from './modules/rnaseq-tasks'
workflow {
transcriptome_ch = channel.fromPath('data/yeast/transcriptome/*.fa.gz')
//
INDEX(transcriptome_ch)
}
包含相对路径要使用
./
多个包含
当多个组件被包含时可以使用分号;
隔开,例如:
nextflow.enable.dsl=2
include { INDEX; QUANT } from './modules/rnaseq-tasks'
workflow {
reads = channel.fromFilePairs('data/yeast/reads/*_{1,2}.fq.gz')
transcriptome_ch = channel.fromPath('data/yeast/transcriptome/*.fa.gz')
INDEX(transcriptome_ch)
QUANT(index.out,reads)
}
模块别名
导入模块时也可以使用关键字as
来给它起别名。例如:
nextflow.enable.dsl=2
include { INDEX } from './modules/rnaseq-tasks'
include { INDEX as SALMON_INDEX } from './modules/rnaseq-tasks'
workflow {
transcriptome_ch = channel.fromPath('data/yeast/transcriptome/*.fa.gz')
INDEX(transcriptome_ch)
SALMON_INDEX(transcriptome_ch)
}
也可以写在同一个include内部:
nextflow.enable.dsl=2
include { INDEX; INDEX as SALMON_INDEX } from './modules/rnaseq-tasks'
workflow {
transcriptome_ch = channel.fromPath('/data/yeast/transcriptome/*.fa.gz)'
INDEX(transcriptome)
SALMON_INDEX(transcriptome)
}
模块参数
一个模块脚本可以设置一个或多个参数:
params.foo = 'Hello'
params.bar = 'world!'
def sayHello() {
println "$params.foo $params.bar"
}
然后有另外一个脚本:
params.foo = 'Hola'
params.bar = 'Mundo'
include {sayHello} from './some/module'
workflow {
sayHello()
}
上面的输出为:
Hola Mundo
可以使用 addParams
选项在不影响外部作用域的情况下扩展模块参数:
include {sayHello} from './some/module' addParams(foo: 'Ciao')
workflow {
sayHello()
}
输出:
Ciao world!