如何追溯用于在 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 前缀技巧似乎不起作用,所以我划掉了文本。
假设我正在遵循为 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 前缀技巧似乎不起作用,所以我划掉了文本。