问题
我如何指定不需要输入值的参数?
我如何引用运行时参数?
目标
了解如何向命令添加额外的选项。
了解如何引用运行时参数。
有时,工具需要额外的命令行选项,这些选项与输入参数并不完全对应。
在本例中,我们将包装Java编译器,以将Java源文件编译为类文件。默认情况下,“javac”将在与源文件相同的目录中创建类文件。然而,CWL输入文件(以及它们所在的目录)可能是只读的,因此我们需要指示“javac”将类文件写入指定的输出目录。
arguments.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: CommandLineTool
label: Example trivial wrapper for Java 9 compiler
hints:
DockerRequirement:
dockerPull: openjdk:9.0.1-11-slim
baseCommand: javac
arguments: ["-d", $(runtime.outdir)]
inputs:
src:
type: File
inputBinding:
position: 1
outputs:
classfile:
type: File
outputBinding:
glob: "*.class"
arguments-job.yml
src:
class: File
path: Hello.java
现在,创建一个示例Java文件,并在命令行上调用cwl-runner
$ echo "public class Hello {}" > Hello.java
$ cwl-runner arguments.cwl arguments-job.yml
[job arguments.cwl] /tmp/tmpwYALo1$ docker \
run \
-i \
--volume=/home/peter/work/common-workflow-language/v1.0/examples/Hello.java:/var/lib/cwl/stg8939ac04-7443-4990-a518-1855b2322141/Hello.java:ro \
--volume=/tmp/tmpwYALo1:/var/spool/cwl:rw \
--volume=/tmp/tmpptIAJ8:/tmp:rw \
--workdir=/var/spool/cwl \
--read-only=true \
--user=1001 \
--rm \
--env=TMPDIR=/tmp \
--env=HOME=/var/spool/cwl \
java:7 \
javac \
-d \
/var/spool/cwl \
/var/lib/cwl/stg8939ac04-7443-4990-a518-1855b2322141/Hello.java
Final process status is success
{
"classfile": {
"size": 416,
"location": "/home/example/Hello.class",
"checksum": "sha1$2f7ac33c1f3aac3f1fec7b936b6562422c85b38a",
"class": "File"
}
}
这里,我们使用arguments字段向命令行添加一个附加参数,这个参数不绑定到特定的输入参数。
arguments: ["-d", $(runtime.outdir)]
这个例子引用了一个运行时参数。运行时参数提供了实际执行工具时有关硬件或软件环境的信息。$(runtime.outdir)参数是指定输出目录的路径。其他参数包括$(runtime.tmpdir), $(runtime.ram), $(runtime.cores), $(runtime.outdirSize)和$(runtime.tmpdirSize)。有关详细信息,请参阅CWL规范的运行时环境部分。