1. 问题
    2. 如何向命令传递参数?
    3. 如何为命令定义参数的顺序?
    4. 目标
    5. 学习如何描述和处理工具的输入参数和文件。

    工具的输入是控制如何运行工具的输入参数列表。每个参数都有一个用于参数名称的id,以及描述对该参数有效的值类型的类型。
    可用的基本类型有string、int、long、float、double和null;复杂类型是数组和记录;此外,还有特殊类型的文件,目录和其它。
    下面的例子演示了一些不同类型的输入参数,它们以不同的方式出现在命令行中。
    首先,创建一个名为inp的文件,内容如下例:
    inp.cwl

    1. #!/usr/bin/env cwl-runner
    2. cwlVersion: v1.0
    3. class: CommandLineTool
    4. baseCommand: echo
    5. inputs:
    6. example_flag:
    7. type: boolean
    8. inputBinding:
    9. position: 1
    10. prefix: -f
    11. example_string:
    12. type: string
    13. inputBinding:
    14. position: 3
    15. prefix: --example-string
    16. example_int:
    17. type: int
    18. inputBinding:
    19. position: 2
    20. prefix: -i
    21. separate: false
    22. example_file:
    23. type: File?
    24. inputBinding:
    25. prefix: --file=
    26. separate: false
    27. position: 4
    28. outputs: []

    创建一个名为inp-job.yml的文件
    inp-job.yml

    1. example_flag: true
    2. example_string: hello
    3. example_int: 42
    4. example_file:
    5. class: File
    6. path: whale.txt

    注意,作为文件类型的“example_file”必须作为一个对象提供,其中包含字段类:File和path。
    接下来,通过在命令行上输入touch whale.txt,使用touch创建一个whale.txt文件。然后cwl-runner命令调用输入对象,使用命令cwl-runner inp.cwl inp-job.yml。下面是这两个命令和预期的命令行输出:

    1. $ touch whale.txt
    2. $ cwl-runner inp.cwl inp-job.yml
    3. [job inp.cwl] /tmp/tmpzrSnfX$ echo \
    4. -f \
    5. -i42 \
    6. --example-string \
    7. hello \
    8. --file=/tmp/tmpRBSHIG/stg979b6d24-d50a-47e3-9e9e-90097eed2cbc/whale.txt
    9. -f -i42 --example-string hello --file=/tmp/tmpRBSHIG/stg979b6d24-d50a-47e3-9e9e-90097eed2cbc/whale.txt
    10. [job inp.cwl] completed success
    11. {}
    12. Final process status is success

    这些/tmp路径来自哪里?

    CWL引用运行器(cwltool)和其他运行器创建临时目录,其中包含指向输入文件的符号软链接,以确保这些工具不会意外地访问没有显式指定的文件


    字段inputBinding是可选的,它指示输入参数是否应该以及如何出现在工具的命令行中。如果inputBinding缺失,则该参数不会出现在命令行中。让我们详细地看看每个示例。

    1. example_flag:
    2. type: boolean
    3. inputBinding:
    4. position: 1
    5. prefix: -f

    type为布尔类型。如果输入参数” example_flag “为” true “,那么prefix的参数将被添加到命令行。如果为false,则不添加参数。

    1. example_string:
    2. type: string
    3. inputBinding:
    4. position: 3
    5. prefix: --example-string

    字符串类型以文字值的形式出现在命令行中。该前缀是可选的,如果提供了,它将作为单独的参数出现在参数之前的命令行中。在上面的示例中,它被呈现为—example-string hello。

    1. example_int:
    2. type: int
    3. inputBinding:
    4. position: 2
    5. prefix: -i
    6. separate: false

    整数(和浮点)类型以十进制文本表示出现在命令行中。当选项separate为false(默认值为true)时,前缀和值被组合成一个参数。在上面的例子中,它显示为-i42。

    1. example_file:
    2. type: File?
    3. inputBinding:
    4. prefix: --file=
    5. separate: false
    6. position: 4

    文件类型作为文件的路径出现在命令行中。当参数类型以问号结尾时,表示该参数为可选参数。在上面的例子中,这显示为—file=/tmp/random/path/whale.txt。但是,如果在输入中没有提供“example_file”参数,命令行中将不会出现任何内容。
    输入文件是只读的。如果希望更新输入文件,必须首先将其复制到输出目录。
    position的值用于确定parameter在命令行中应该出现的位置。位置是相对的,而不是绝对的。因此,位置不一定是连续的,位置为1、3、5的三个参数将产生与1、2、3相同的命令行。多个参数可以具有相同的位置(使用参数名打破联系),并且位置字段本身是可选的。默认位置是0。
    baseCommand字段将始终出现在最后的命令行参数之前。