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