使用conda在Snakemake包装器中指定包装的最佳environment.yml
做法是什么?
我了解这些渠道应该是:
channels:
- conda-forge
- bioconda
- base
但是,指定软件包的最佳选择是什么?我没有指定版本吗?完整版本?
使用完整版本之前曾导致使用无限/超长conda环境的问题。但是,不固定版本会带来隐式升级到软件包不兼容版本的风险。
我仅指定直接依赖项还是应该将conda env export
的输出放在此处,以便冻结所有内容?
答案 0 :(得分:7)
对于软件包版本,我通常会选择固定主要版本和次要版本。这样,用户在创建环境时将获得最新的安全补丁和错误修复,而任何东西都不应以向后不兼容的方式进行更改(只要开发人员正确遵循semantic versioning)。
此外,我将仅指定直接依赖项,并让环境求解器处理所有隐式依赖项。这提供了一定的自由度,可以满足不同软件包的不同需求,而通常,软件包的配方应指定对特定版本的任何限制。
避免(未来)冲突并保持环境快速创建的另一种方法是保持环境尽可能的小巧(see Johannes' comment below)。如果不同的规则仅共享一些依赖关系,而不共享其他依赖关系,我宁愿为每个规则创建单独的最小环境,而不是重用更大的环境。 Snakemake包装器仍会执行此操作,因为每个包装器都有自己的环境定义。
As Johannes pointed out,同样适用于频道:仅指定您实际使用的频道,而不再需要指定base
频道。并且在使用mamba
时,可以将bioconda
指定为第一个频道。
讨论mamba
:如果速度很重要,我目前会使用mamba来解决环境问题-通常,它比conda快得多,并且可以确保您将获得最新版本的软件包。在snakemake
中,您也可以通过--conda-frontend mamba
使用它,如Maarten's comment to the question所指出。
但是,当然,一切都取决于。如果您知道软件包的配方未处理的版本不兼容,则可能需要指定和固定隐式依赖项。如果您拥有创建可以随补丁程序版本更改的输出的软件,那么您当然必须固定补丁程序版本。