CWL の requirements 一巡り: InlineJavascriptRequirement
この記事は CWL Advent Calendar 2020 の5日目の記事です。
Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]。
今回は CWL v1.2 で定義されている InlineJavascriptRequirement
について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。
対象読者
- CWL をかじったことがあるけど
requirements
はよくわからない人- つまり中級者以上が対象です。
- 初心者は CWL Advent Calendar 2020 の初日の記事へ Go!
例
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)})"
InlineJavascriptRequirement
が requirements
に記述されている場合、$()
や ${}
で囲まれた部分は 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 に対応していなくて悲しみ
-
つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎
-
これに似たややこしい仕様に Parameter references があります。
$()
が JavaScript として解釈されるか Parameter references として解釈されるかはInlineJavascriptRequirement
の有無でしか判断できないため、人が書いた CWL を読む時には注意しましょう。 ↩︎ -
JavaScript の実行には Node.js が必要です。いくつかの処理系では、DockerRequirement と
InlineJavascriptRequirement
の両方が指定された場合にはnode
コンテナ をダウンロードして実行しようとするため、若干の注意が必要です。 ↩︎
Discussion
本筋から外れてしまうコメントで恐縮ですが、Zennのコードブロックにはprism.jsが使われており、現状の対応言語はprism.jsの対応言語という感じです…。
CWLはコードブロックの言語をyamlにするとわりといい感じに見えるのですかね?
cwl
が指定されたときにyaml
のハイライトをあてるようなことは現時点でも対応可能なのですが…コメントありがとうございます。
なるほど。了解しました。
はい。CWL の文法自体は、YAML に
cwlVersion
などの専用の語彙が追加されたものとして定義されています。お願いします!
遅くなりましたがcwl対応しました!