1. 问题
  2. 当我想要动态地创建值,而CWL没有提供这样做的内置方法时,我该怎么做?
  3. 目标
  4. 学习如何在CWL描述中插入JavaScript表达式。

如果您需要操作输入参数,请在InlinejavascriptRerequirements中包含需求,然后在参数引用合法的任何地方,您可以提供将由CWL运行器评估的Javascript片段。
注意:JavaScript表达式应该只在绝对必要的时候使用。当操作文件名、扩展名、路径等时,考虑是否可以使用文件中的内置属性,如basename、nameroot、nameext等。请参阅推荐实践的列表。
expression.cwl

  1. #!/usr/bin/env cwl-runner
  2. cwlVersion: v1.0
  3. class: CommandLineTool
  4. baseCommand: echo
  5. requirements:
  6. InlineJavascriptRequirement: {}
  7. inputs: []
  8. outputs:
  9. example_out:
  10. type: stdout
  11. stdout: output.txt
  12. arguments:
  13. - prefix: -A
  14. valueFrom: $(1+1)
  15. - prefix: -B
  16. valueFrom: $("/foo/bar/baz".split('/').slice(-1)[0])
  17. - prefix: -C
  18. valueFrom: |
  19. ${
  20. var r = [];
  21. for (var i = 10; i >= 1; i--) {
  22. r.push(i);
  23. }
  24. return r;
  25. }

因为这个工具不需要任何“输入”,我们可以在一个(几乎)空的作业文件中运行它:
empty.yml

  1. {}

empty.yml包含一个空JSON对象的描述。JSON对象描述包含在花括号{}中,因此空对象仅由一组空括号表示。
我们运行expression.cwl

  1. $ cwl-runner expression.cwl empty.yml
  2. [job expression.cwl] /home/example$ echo \
  3. -A \
  4. 2 \
  5. -B \
  6. baz \
  7. -C \
  8. 10 \
  9. 9 \
  10. 8 \
  11. 7 \
  12. 6 \
  13. 5 \
  14. 4 \
  15. 3 \
  16. 2 \
  17. 1 > /home/example/output.txt
  18. [job expression.cwl] completed success
  19. {
  20. "example_out": {
  21. "location": "file:///home/example/output.txt",
  22. "basename": "output.txt",
  23. "class": "File",
  24. "checksum": "sha1$a739a6ff72d660d32111265e508ed2fc91f01a7c",
  25. "size": 36,
  26. "path": "/home/example/output.txt"
  27. }
  28. }
  29. Final process status is success
  30. $ cat output.txt
  31. -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
      • FrominputBinding
        • valueFrom
    • From CommandOutputParamater
      • format
      • secondaryFiles
      • From CommandOutputBinding
        • glob
        • outputEval
  • From Workflow
    • From InputParameter and WorkflowOutputParameter
      • format
      • secondaryFiles
    • From steps
      • From WorkflowStepInput
        • valueFrom
  • From ExpressionTool
    • expression
    • From InputParameter and ExpressionToolOutputParameter
      • format
      • secondaryFiles
  • FromResourceRequirement
    • coresMin
    • coresMax
    • ramMin
    • ramMax
    • tmpdirMin
    • tmpdirMax
    • outdirMin
    • outdirMax
  • From InitialWorkDirRequirement`
    • listing
    • in Dirent
      • entry
      • entryname
  • From EnvVarRequirement
    • From EnvironmentDef
      • envValue