CWL の requirements 一巡り: InlineJavascriptRequirement

公開:2020/12/04
更新:2020/12/12
2 min読了の目安(約2600字TECH技術記事 3

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

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

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

対象読者

Conformance test #14: tests/null-expression1-tool.cwl:

#!/usr/bin/env cwl-runner

class: ExpressionTool
requirements:
  - class: InlineJavascriptRequirement
cwlVersion: v1.2

inputs:
  i1:
    type: Any
    default: "the-default"

outputs:
  output: int

expression: "$({'output': (inputs.i1 == 'the-default' ? 1 : 2)})"

InlineJavascriptRequirementrequirements に記述されている場合、$()${} で囲まれた部分は JavaScript のコードとして解釈されます[2][3]

上の例だと、

  • 入力パラメータ i1 が与えられていない場合には "the-default"inputs.i1 として評価され(入力パラメータの値は inputs.パラメータ名 で参照できます)、expression フィールドの Javascript の expression が 1 に評価されます。その結果、この ExpressionTool の出力パラメータ outputs.output として 1 が返ります。
  • i1 として "the-default" 以外が渡された場合には、outputs.output として 2 が返ります。

InlineJavascriptRequirement は非常に強力ですが、読者に大きな負担がかかる可能性があるため、outputBinding.glob などの代替手段がある場合にはそちらを使ったほうがいいでしょう。

おまけ

Zenn のコードブロックが CWL に対応していなくて悲しみ

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

  2. これに似たややこしい仕様に Parameter references があります。$() が JavaScript として解釈されるか Parameter references として解釈されるかは InlineJavascriptRequirement の有無でしか判断できないため、人が書いた CWL を読む時には注意しましょう。 ↩︎

  3. JavaScript の実行には Node.js が必要です。いくつかの処理系では、DockerRequirementInlineJavascriptRequirement の両方が指定された場合には node コンテナ をダウンロードして実行しようとするため、若干の注意が必要です。 ↩︎