🐓

CWL の requirements 一巡り: InitialWorkDirRequirement

2020/12/12に公開

この記事は CWL Advent Calendar 2020 の11日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている InitialWorkDirRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

Conformance test #56: tests/rename.cwl:

class: CommandLineTool
cwlVersion: v1.2
baseCommand: "true"
requirements:
  InitialWorkDirRequirement:
    listing:
      - entryname: $(inputs.newname)
        entry: $(inputs.srcfile)
inputs:
  srcfile: File
  newname: string
outputs:
  outfile:
    type: File
    outputBinding:
      glob: $(inputs.newname)

InitialWorkDirRequirement を利用することで、入力パラメータで渡されたファイル名を変更してからツールに渡すことが可能になります。これにより、入力ファイルに特定の名前が付けられていることを前提にしたツールなどをワークフローに組み込むことが容易になります。上の例だと、入力パラメータとして渡されたファイル $(inputs.srcfile)$(inputs.newname) で指定した名前に変更し、$(outputs.outfile) として捕捉しています。また、変更後のファイルは $(inputs.srcfile) があるディレクトリではなく $(runtime.outdir) に配置されます。

InitialWorkDirRequirement はファイル名変更以外の用途でも使われることがあります。例えば、CWL 処理系は $(runtime.outdir) を作業ディレクトリにしてツールを実行します (4.2 節 参照) が、このディレクトリが --outdir などで指定された出力ディレクトリと同じとは限りません[2]。また、同節には以下のようにも書かれています (文中の "designated output directory" は $(runtime.outdir) のこと)。

An implementation may forbid the tool from writing to any location in the runtime environment file system other than the designated temporary directory, system temporary directory, and designated output directory.

つまり、作業ディレクトリにファイルを出力するのではなく、入力ファイルと同じディレクトリにファイルを出力するタイプのツールはそのままでは動きませんInitialWorkDirRequirement を用いて入力ファイルを $(runtime.outdir) に明示的にコピーすることで、この問題を解決できます[3]

脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎

  2. 例えば CWL のリファレンスランナーの cwltool は、専用の一時ディレクトリを $(runtime.outdir) として作成し、そこでコマンドを実行します (User Guide: Essential Input Parameters 参照)。 ↩︎

  3. ツール開発者の皆様は、InitialWorkDirRequirement なしでも CWL 定義を書けるようなツールを作るように心がけましょう! ↩︎

Discussion