module.md

Nextflow DSL2 支援模組化流程設計,使 pipeline 更具重用性、可測試性與可維護性。模組通常定義於 modules/subworkflows/ 資料夾中,並在主 workflow 中引入。


🔹 基本模組結構(單一 process 模組)

一個模組通常是一個 process 定義,包含 input:output:script: 區塊,並使用 emit: 命名輸出。

📄 modules/qc/fastqc.nf

process FASTQC {
  tag "$sample_id"

  input:
    tuple val(sample_id), path(reads)

  output:
    path "${sample_id}_fastqc.zip" emit: fastqc_zip

  script:
  """
  fastqc $reads -o .
  mv *.zip ${sample_id}_fastqc.zip
  """
}

🔹 主 workflow 中呼叫模組

📄 main.nf

workflow {
  Channel.fromPath('data/*.fq.gz')
         .map { file -> tuple(file.baseName, file) }
         .set { read_ch }

  FASTQC(read_ch)
  FASTQC.out.fastqc_zip.view()
}

🔹 模組匯入方式(include)

main.nf 中使用 include 引入模組:

include { FASTQC } from './modules/qc/fastqc.nf'

若模組名稱與檔名一致,也可只給路徑:

include { FASTQC } from './modules/qc'

若有多個模組要引用,可批次包含:

include { FASTQC; TRIMMOMATIC; BWA } from './modules/qc'

🔹 使用 emit 與輸出名稱

模組的輸出應透過 emit: 來命名,使主 workflow 可明確引用:

output:
  path "${sample_id}.bam" emit: aligned_bam
workflow {
  BWA(indexed_reads)
  BWA.out.aligned_bam.view()
}

🔹 模組化設計原則

原則
說明

單一功能原則

每個模組只負責一個明確步驟(如 fastqc, trim, map)

輸入輸出明確

使用 tupleemit 定義清楚的輸入與輸出

可重用性

模組應盡量與特定資料路徑或參數脫鉤,可透過 params 設定

無副作用

避免模組修改共用檔案,所有輸出皆在工作目錄中產生


🔹 進階:模組參數與 config 整合

模組中可使用 params 提供額外參數支援:

params {
  fastqc_threads = 2
}

模組中:

script:
"""
fastqc --threads ${params.fastqc_threads} $reads -o .
"""

🔹 子流程模組(subworkflow)

除了單一 process,也可將多個模組組成 subworkflow,以便封裝高階邏輯:

📄 subworkflows/qc_pipeline.nf

workflow QC_PIPELINE {
  take:
    reads

  main:
    TRIMMOMATIC(reads)
    FASTQC(TRIMMOMATIC.out.trimmed_reads)

  emit:
    trimmed = TRIMMOMATIC.out.trimmed_reads
    report  = FASTQC.out.fastqc_zip
}

主流程中:

include { QC_PIPELINE } from './subworkflows/qc_pipeline.nf'
QC_PIPELINE(reads_ch)

模組化是大型 Nextflow workflow 的關鍵,配合 emit:includeparams 等機制可打造具可讀性、可測試性、可版本化的流程元件。建議搭配 nf-core 的模組撰寫標準與自動化測試,強化流程穩定性與共享性。

Last updated