Snakemake 包装器中(生物)conda 版本的最佳实践?

Man*_*uel 2 conda snakemake

environment.yml使用 conda 在 Snakemake 包装器中指定包的最佳实践是什么?我明白渠道应该是:

channels:    
  - conda-forge
  - bioconda
  - base
Run Code Online (Sandbox Code Playgroud)

但是,指定包的好选择是什么?我是否指定没有版本?完整版?

使用完整版本导致之前使用无限/超长 conda 环境解析问题。但是,不固定版本会带来隐式升级到不兼容版本的包的风险。

我是只指定直接依赖项还是应该将输出放在conda env export那里以便一切都被冻结?

dla*_*ann 7

对于包版本号,我通常会选择固定主要和次要版本。通过这种方式,用户在创建环境时将获得最新的安全补丁和错误修复,而不会以向后不兼容的方式进行任何更改(只要开发人员正确遵循语义版本控制)。

此外,我只会指定直接依赖项,并让环境求解器处理任何隐式依赖项。这提供了一定程度的自由来满足不同包的不同需求,而通常包的配方应该指定对特定版本的任何限制。

另一种避免(未来)冲突并保持环境快速创建的方法是保持环境尽可能小和细化请参阅下面的 Johannes 评论)。如果不同的规则只共享一些依赖项而不共享其他依赖项,我宁愿为每个规则创建单独的最小环境,而不是重用更大的环境。Snakemake 包装器无论如何都会这样做,因为每个包装器都有自己的环境定义。

正如约翰内斯所指出的,这同样适用于频道:只指定您实际使用的频道,无需再指定base频道。并且在使用时mamba,您可以指定bioconda为第一个通道。

谈论mamba:如果速度很重要,我目前会使用mamba来解决环境问题——它通常比 conda 快得多,并且更能确保您获得最新版本的软件包。在 中snakemake,您可以通过--conda-frontend mambaMaarten 对问题的评论中指出的那样使用它。

但是,当然一切都取决于。如果您知道包的配方未处理的版本不兼容,则可能需要指定和固定隐式依赖项。如果您的软件可以创建可以随补丁版本更改的输出,那么您当然必须固定补丁版本。

  • 除此之外,只需指定所需的通道即可。现在不需要指定base。仅当您有来自 Bioconda 的软件包时。如果是这样的话,当使用 mamba 时,您现在可以将 bioconda 放在顶部。最后,尝试使环境尽可能细粒度(按规则/步骤),以提高透明度、速度和可维护性。 (2认同)