问题
我如何编写一个简单的命令行工具的CWL描述?
目标
学习CWL描述的基本结构。
最简单的“hello world”程序。它接受一个输入参数,将消息写入终端或作业日志,并且不会产生永久输出。CWL文档是用JSON或YAML编写的,或者两者的混合。我们将在本指南中使用YAML。如果您不熟悉YAML,您可能会发现参考这个快速教程来了解在CWL中使用的YAML子集是有帮助的。
首先,创建一个名为First -tool.cwl的文件,包含下面的方框文本。它将帮助您使用一个文本编辑器,可以指定它来生成YAML或JSON格式的文本。无论你使用什么文本编辑器,你看到的缩进都不应该使用制表符创建。
1st-tool.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: CommandLineTool
baseCommand: echo
inputs:
message:
type: string
inputBinding:
position: 1
outputs: []
接下来,创建一个名为echo-job.yml的文件,它将描述运行的输入:
echo-job.yml
message: Hello world!
现在,调用cwl-runner命令调用1st-tool.cwl和输入文件echo-job.yml。该命令是cwl-runner 1st-tool.cwl echo-job.yml。下面框出的文本显示了这个命令和预期的输出。
$ cwl-runner 1st-tool.cwl echo-job.yml
[job 1st-tool.cwl] /tmp/tmpmM5S_1$ echo \
'Hello world!'
Hello world!
[job 1st-tool.cwl] completed success
{}
Final process status is success
cwl-runner 1st-tool.cwl echo-job.yml是使用CWL时经常遇到的一般形式的示例。命令的格式为:
cwl-runner [tool-or-workflow-description] [input-job-settings]
我们现在来分解1st-tool.cwl内容:
cwlVersion: v1.0
class: CommandLineTool
cwlVersion字段表示文档使用的CWL规范的版本。
class字段表示本文档描述的是命令行工具。
baseCommand: echo
bascommand提供了将要实际运行的程序的名称(echo)。echo是bash和C shell中的内置程序。
inputs:
message:
type: string
inputBinding:
position: 1
inputs部分描述了工具的输入。这是输入参数的映射列表(有关格式的更多信息,请参阅YAML指南),每个参数包括一个标识符、一个数据类型,还有一个可选的inputBinding。inputBinding描述了这个输入参数应该如何出现在命令行中。在本例中,position字段指示它应该出现在命令行中的位置。
outputs: []
这个工具没有正式的输出,因此输出部分是一个空列表。