问题当我想要动态地创建值,而CWL没有提供这样做的内置方法时,我该怎么做?目标学习如何在CWL描述中插入JavaScript表达式。
如果您需要操作输入参数,请在InlinejavascriptRerequirements中包含需求,然后在参数引用合法的任何地方,您可以提供将由CWL运行器评估的Javascript片段。
注意:JavaScript表达式应该只在绝对必要的时候使用。当操作文件名、扩展名、路径等时,考虑是否可以使用文件中的内置属性,如basename、nameroot、nameext等。请参阅推荐实践的列表。
expression.cwl
#!/usr/bin/env cwl-runnercwlVersion: v1.0class: CommandLineToolbaseCommand: echorequirements:InlineJavascriptRequirement: {}inputs: []outputs:example_out:type: stdoutstdout: output.txtarguments:- prefix: -AvalueFrom: $(1+1)- prefix: -BvalueFrom: $("/foo/bar/baz".split('/').slice(-1)[0])- prefix: -CvalueFrom: |${var r = [];for (var i = 10; i >= 1; i--) {r.push(i);}return r;}
因为这个工具不需要任何“输入”,我们可以在一个(几乎)空的作业文件中运行它:
empty.yml
{}
empty.yml包含一个空JSON对象的描述。JSON对象描述包含在花括号{}中,因此空对象仅由一组空括号表示。
我们运行expression.cwl
$ cwl-runner expression.cwl empty.yml[job expression.cwl] /home/example$ echo \-A \2 \-B \baz \-C \10 \9 \8 \7 \6 \5 \4 \3 \2 \1 > /home/example/output.txt[job expression.cwl] completed success{"example_out": {"location": "file:///home/example/output.txt","basename": "output.txt","class": "File","checksum": "sha1$a739a6ff72d660d32111265e508ed2fc91f01a7c","size": 36,"path": "/home/example/output.txt"}}Final process status is success$ cat output.txt-A 2 -B baz -C 10 9 8 7 6 5 4 3 2 1
注意,需求必须以数组的形式提供,每个条目(在本例中,只有class: inlinejavascriptrequirequirement)标记为a -。同样的语法用于描述额外的命令行参数。
哪里允许JavaScript表达式?
就像参数引用一样,只能在某些字段中使用JavaScript表达式。这些都是:
- From
CommandLineTool- arguments
valueFrom
stdinstdoutstderr- From CommandInputParameter
formatsecondaryFiles- From
inputBindingvalueFrom
- From CommandOutputParamater
formatsecondaryFiles- From CommandOutputBinding
globoutputEval
- arguments
- From Workflow
- From InputParameter and WorkflowOutputParameter
formatsecondaryFiles
- From steps
- From WorkflowStepInput
valueFrom
- From WorkflowStepInput
- From InputParameter and WorkflowOutputParameter
- From ExpressionTool
expression- From InputParameter and ExpressionToolOutputParameter
formatsecondaryFiles
- From
ResourceRequirementcoresMincoresMaxramMinramMaxtmpdirMintmpdirMaxoutdirMinoutdirMax
- From InitialWorkDirRequirement`
listing- in Dirent
entryentryname
- From EnvVarRequirement
- From EnvironmentDef
envValue
- From EnvironmentDef
