问题
当我想要动态地创建值,而CWL没有提供这样做的内置方法时,我该怎么做?
目标
学习如何在CWL描述中插入JavaScript表达式。
如果您需要操作输入参数,请在InlinejavascriptRerequirements中包含需求,然后在参数引用合法的任何地方,您可以提供将由CWL运行器评估的Javascript片段。
注意:JavaScript表达式应该只在绝对必要的时候使用。当操作文件名、扩展名、路径等时,考虑是否可以使用文件中的内置属性,如basename、nameroot、nameext等。请参阅推荐实践的列表。
expression.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: CommandLineTool
baseCommand: echo
requirements:
InlineJavascriptRequirement: {}
inputs: []
outputs:
example_out:
type: stdout
stdout: output.txt
arguments:
- prefix: -A
valueFrom: $(1+1)
- prefix: -B
valueFrom: $("/foo/bar/baz".split('/').slice(-1)[0])
- prefix: -C
valueFrom: |
${
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
stdin
stdout
stderr
- From CommandInputParameter
format
secondaryFiles
- From
inputBinding
valueFrom
- From CommandOutputParamater
format
secondaryFiles
- From CommandOutputBinding
glob
outputEval
- arguments
- From Workflow
- From InputParameter and WorkflowOutputParameter
format
secondaryFiles
- From steps
- From WorkflowStepInput
valueFrom
- From WorkflowStepInput
- From InputParameter and WorkflowOutputParameter
- From ExpressionTool
expression
- From InputParameter and ExpressionToolOutputParameter
format
secondaryFiles
- From
ResourceRequirement
coresMin
coresMax
ramMin
ramMax
tmpdirMin
tmpdirMax
outdirMin
outdirMax
- From InitialWorkDirRequirement`
listing
- in Dirent
entry
entryname
- From EnvVarRequirement
- From EnvironmentDef
envValue
- From EnvironmentDef