在这种情况下,变量是我们写入脚本的占位符,而不是实际的文件名和参数值。然后,我们可以指定要在运行时(即运行脚本时使用)的文件名和值,而无需完全修改脚本,这非常方便。请注意,我们不必对所有内容都使用变量 -对于某些参数,如果它们永远不会在运行之间改变,则对值进行硬编码是有意义的。
因此,让我们看一下如何在WDL脚本中包含变量(稍后我们将讨论如何在运行时指定变量值)。我们可能希望在两个不同的级别包含变量:在一个个体task
中 ,或者在整个工作流的级别,以便变量可用于其调用的任何任务。我们将从任务级别的变量开始,因为它是最简单的情况,然后在此基础上来处理工作流级别的变量,它带有一些(非常合理且完全不困难)的复杂性。在进行解释的过程中,我们将探讨如何将变量值从一个任务继承到另一个任务,这是将任务连接在一起的下一个主题的一种预览。
1 添加任务级变量
回到task_A
在前面的例子中,让我们看看它实际上包含在command和output组件块。我们编了一个虚构的程序do_stuff
。这个程序需要分别使用参数R=
和I=
提供两个文件,并生成一个输出文件,该文件必须使用参数O=
进行命名。
do_stuff R=reference.fa I=input.bam O=variants.vcf
要用变量替换这些硬编码的值,我们首先必须 声明 变量,这是一种奇特的说法,即我们在task 块的顶部写出它们的名称以及它们代表什么类型的值 , 例如 File ref
。然后,我们可以在命令中的适当位置,大括号中插入变量名,并在前面加一个美元符号, 例如 R=${ref}
。
在这里,对于 O=
的值,我们使用变量来指定一个基本名称。该脚本将自动地将这个基本名称与我们硬编码的.ext
文件扩展名连接起来,从${id}.ext
生成完整的输出文件名。
最后,我们确定作为程序输出的’ command ‘的参数(在本例中是’ O= '参数),并通过将其分配的内容复制到output
块来声明它们,如示例所示。注意,这里我们也显式地指定了变量类型。
2 添加工作流级别的变量
将一个层次移到工作流的主体上,您会看到我们现在也有声明顶部的一组变量。这些声明基本上遵循与任务中的声明相同的规则。我们现在需要做的就是连接这两个级别,以便传递给工作流的参数可以用作任务的输入。
为此,我们只需在call函数
中添加一个代码块即可 。该块仅包含input:
一行,该 行枚举了哪些工作流级变量连接到哪些任务级变量。
我们在这个工作流中调用的第二个任务task_B
也做了类似的事情,但有一个关键的区别。首先,常见的部分:task_B
也接受引用文件作为输入,所以我们可以简单地将相同的工作流级变量my_ref
提供给task_B
中相应的变量。但是,对于它的其他输入,我们需要给task_B
提供task_A
的输出。我们可以方便地使用task_name.output_variable
来引用它。这里是指task_A.out
。
最后,我们仍然需要知道如何将值传递给工作流以填充所有这些变量。