2.15. 暂存输入文件#

通常,输入文件存放于只读目录中,而且位于输出目录之外。 然而,如果基础工具工作的惯例是将输出文件写到输入文件所在的同一目录,则会导致问题。 使用 InitialWorkDirRequirement 可以实现在输出目录中暂存输入文件。在此示例中,我们使用 JavaScript 表达式,提取输入文件去除前导目录路径后的基本文件名 (base name).

linkfile.cwl#
#!/usr/bin/env cwl-runner
cwlVersion: v1.2
class: CommandLineTool
hints:
  DockerRequirement:
    dockerPull: openjdk:9.0.1-11-slim
baseCommand: javac

requirements:
  InitialWorkDirRequirement:
    listing:
      - $(inputs.src)

inputs:
  src:
    type: File
    inputBinding:
      position: 1
      valueFrom: $(self.basename)

outputs:
  classfile:
    type: File
    outputBinding:
      glob: "*.class"
arguments-job.yml#
src:
  class: File
  path: Hello.java

现在,在命令行上以工具描述和输入对象为参数调用 cwltool:

$ cwltool linkfile.cwl arguments-job.yml
INFO /opt/hostedtoolcache/Python/3.9.19/x64/bin/cwltool 3.1.20240508115724
INFO Resolved 'linkfile.cwl' to 'file:///home/runner/work/user_guide/user_guide/src/_includes/cwl/staging-input-files/linkfile.cwl'
INFO [job linkfile.cwl] /tmp/2iqitleo$ docker \
    run \
    -i \
    --mount=type=bind,source=/tmp/2iqitleo,target=/EgzfXh \
    --mount=type=bind,source=/tmp/kc98d8f6,target=/tmp \
    --mount=type=bind,source=/home/runner/work/user_guide/user_guide/src/_includes/cwl/staging-input-files/Hello.java,target=/EgzfXh/Hello.java,readonly \
    --workdir=/EgzfXh \
    --read-only=true \
    --net=none \
    --user=1001:127 \
    --rm \
    --cidfile=/tmp/qu3avd1k/20240518114755-685376.cid \
    --env=TMPDIR=/tmp \
    --env=HOME=/EgzfXh \
    openjdk:9.0.1-11-slim \
    javac \
    Hello.java
INFO [job linkfile.cwl] completed success
{
    "classfile": {
        "location": "file:///home/runner/work/user_guide/user_guide/src/_includes/cwl/staging-input-files/Hello.class",
        "basename": "Hello.class",
        "class": "File",
        "checksum": "sha1$fdb876b40ad9ebc7fee873212e02d5940588642e",
        "size": 184,
        "path": "/home/runner/work/user_guide/user_guide/src/_includes/cwl/staging-input-files/Hello.class"
    }
}INFO Final process status is success