1. 问题
    2. 如果一个工具需要能够将输出写到它的输入文件存储的位置,我可以做什么?
    3. 目标
    4. 学习如何处理工具希望将输出文件写入与其输入文件相同的目录的情况。

    通常,输入文件位于与输出目录分开的只读目录中。如果底层工具希望将其输出文件与输入文件一起写入同一个目录中,这就会导致问题。您可以使用InitialWorkDirRequirement将输入文件分级到输出目录中。在这个例子中,我们使用一个JavaScript表达式从它的主目录路径中提取输入文件的基本名称。
    linkfile.cwl

    1. #!/usr/bin/env cwl-runner
    2. cwlVersion: v1.0
    3. class: CommandLineTool
    4. hints:
    5. DockerRequirement:
    6. dockerPull: openjdk:9.0.1-11-slim
    7. baseCommand: javac
    8. requirements:
    9. InitialWorkDirRequirement:
    10. listing:
    11. - $(inputs.src)
    12. inputs:
    13. src:
    14. type: File
    15. inputBinding:
    16. position: 1
    17. valueFrom: $(self.basename)
    18. outputs:
    19. classfile:
    20. type: File
    21. outputBinding:
    22. glob: "*.class"

    arguments-job.yml

    1. src:
    2. class: File
    3. path: Hello.java

    运行cwl-runner

    1. $ cwl-runner linkfile.cwl arguments-job.yml
    2. [job 139928309171664] /home/example$ docker run -i --volume=/home/example/Hello.java:/var/lib/cwl/job557617295_examples/Hello.java:ro --volume=/home/example:/var/spool/cwl:rw --volume=/tmp/tmpmNbApw:/tmp:rw --workdir=/var/spool/cwl --read-only=true --net=none --user=1001 --rm --env=TMPDIR=/tmp java:7 javac Hello.java
    3. Final process status is success
    4. {
    5. "classfile": {
    6. "size": 416,
    7. "location": "/home/example/Hello.class",
    8. "checksum": "sha1$2f7ac33c1f3aac3f1fec7b936b6562422c85b38a",
    9. "class": "File"
    10. }
    11. }