如何追溯用于在 snakemake 工作流程中生成结果文件的确切软件版本

How to trace-back exact software version(s) used to generate result-files in a snakemake workflow

假设我正在遵循为 snakemake 建议的最佳实践工作流程。现在我想知道给定文件(例如 plots/myplot.pdf)是如何(即哪个版本)生成的。我发现这非常困难,如果不是不可能的话,只有手头有结果文件夹。

更详细地说,我是使用生成的结果。 snakemake --use-conda --conda-prefix ~/.conda/myenvs 将解析并下载以下规则中指定的 conda 环境(从 documentation 复制):

rule NAME:
    input:
        "table.txt"
    output:
        "plots/myplot.pdf"
    conda:
        "envs/ggplot.yaml"
    script:
        "scripts/plot-stuff.R"

假设envs/ggplot.yaml的内容如下:

channels:
  - conda-forge
dependencies:
  - r-ggplot2

完成后ggplot环境将保存在say下(注意,snakemake自动分配的环境名称d2d1d57b): ~/.conda/myevns/d2d1d57b

问题是如果我发送 workflow 子文件夹,例如作为其他人的结果(或作为论文的补充),我不知道那个 运行 使用了什么 ggplot 版本。我只知道 yaml 文件的内容(使用 --reports. 时也会报告)。 此外,由于 ggplot 依赖于其他软件,例如 R,我不知道使用此环境的给定规则使用了哪个 R 版本,因为 yaml 文件未列出间接依赖项。

理想情况下,我希望完整的环境软件版本随工作流结果一起提供。 作为一种解决方法,可以使用 conda env export name_of_env 并将输出复制到结果文件夹中,但奇怪的是 conda list -n ~/.conda/myevns/d2d1d57b 不起作用(由于错误 Characters not allowed: ('/', ' ', ':', '#')

手动创建环境并检查确实给了我(以及其他信息):

r-base                    4.0.2                he766273_1    conda-forge
r-ggplot2                 3.3.2             r40h6115d3f_0    conda-forge

这正是我所追求的,但这当然是手动的太乏味了。

据我所知,在使用包装器时也是如此。

总而言之,给定一个工作流,甚至对于工作流中的一个给定文件,如何追溯使用哪个或哪些确切的软件版本来生成它。理想情况下,默认情况下,此信息将自动随工作流程的结果一起发送。

也许我什至遗漏了一些非常明显的东西,所以希望有人能对此有所启发。

如@Maarten-vd-Sande所述,应在 conda env 文件中指定版本。正如您可能想的那样,您还需要在 conda env 文件中定义 r-base 及其版本,以确保使用特定版本的 R。请参阅此处的 example 来自 snakemake-wrapper.

作为可重复研究的最佳实践的一部分,强烈建议在 conda env 文件中指定工具版本。 Snakemake-wrappers 通常遵循此规则,但您可能会发现 some not following this.

根据我们在评论中的讨论,您可以将您的环境重定向到日志文件:

rule NAME:
    input:
        "table.txt"
    output:
        "plots/myplot.pdf"
    log:
        "mylog.txt"
    conda:
        "envs/ggplot.yaml"
    shell:
        """
        conda env export > {log} 
        yourcode
        """

然而,正如你所说,如果人们不使用 --use-conda,这将不起作用,而且将它添加到每个规则中是很乏味的,所以你可以尝试这样的事情(未经测试,可能无法正常工作):

if workflow.use_conda:
    shell.prefix("set -o pipefail; conda env export > {log}; ")

将导出添加到每个 shell 命令!

现在如果你使用脚本,我就不太确定如何继续了。 “最简单”可能是在 python/R

内的 shell 命令中调用“conda env export”

编辑

shell 前缀技巧似乎不起作用,所以我划掉了文本。