首页 > 解决方案 > 如何追溯用于在snakemake工作流程中生成结果文件的确切软件版本

问题描述

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

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

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

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

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

总而言之,给定工作流程甚至工作流程中的给定文件,如何追溯用于生成它的确切软件版本。理想情况下,默认情况下,此信息将与工作流的结果一起自动提供。

也许我什至错过了一些非常明显的东西,所以希望有人能对此有所了解。

标签: condasnakemakereproducible-research

解决方案


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

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 前缀技巧似乎不起作用,所以我删除了文本。


推荐阅读