如何管理Conda中的开发依赖?

ben*_*min 5 packaging continuous-deployment conda

我想要两个环境:一个生产环境,它是测试环境的严格子集。如何使用 Conda(或 micromamba)实现此目的?

测试需要一些额外的实用程序,这些实用程序不需要捆绑在生产 Docker 映像中。主要思想是确保生产安装中的子依赖项与配套环境中测试的版本完全相同。

可能性示例:

  • 是否有一个选项可以指定一个约束文件(例如 pip),该文件可以包含比当前安装的包更多的包(以及从测试环境填充此文件的方法,以在创建产品环境时使用)?
  • 有没有某种方法可以限制 conda 只从本地缓存中检索包,该缓存是由先前环境的安装新填充的?
  • 是否可以选择安装附加(测试)要求,同时强制 conda 不升级/降级环境中的任何现有软件包?(但是以这种方式基于产品环境的副本的测试环境可能无法满足版本冲突..)

mer*_*erv 2

Conda 不以任何有用的方式直接支持嵌套环境。但是,有一些定义明确的步骤可以生成具有相同版本的通用包的环境。以下是一种可能的程序。

克隆+冻结安装

为了给出一个具体的示例,以及使用 Conda 的通用性(不是以 Python 为中心)的示例,让我们考虑一个R 包的开发项目。假设我们有两组需求:

需求.prod.txt

r-base=4.0
r-magrittr
r-dplyr
Run Code Online (Sandbox Code Playgroud)

需求.test.txt

r-testthat
r-usethis
Run Code Online (Sandbox Code Playgroud)

以下命令将创建两个环境,其中测试环境 ( pkg_test ) 将是生产环境 ( pkg_prod ) 的超集:

## first, use Mamba if you aren't already
## conda install -n base conda-forge::mamba

## create the dev environment
mamba create -n pkg_prod --file requirements.prod.txt

## create the test environment as a clone
mamba create --clone pkg_prod -n pkg_test

## install the additional requirements, without updating pkgs
mamba install -n pkg_test --freeze-installed --file requirements.test.txt
Run Code Online (Sandbox Code Playgroud)

如果您更改需求,最好是重新创建环境。我推荐 Mamba,因为它可以最大限度地缩短求解时间,在出现问题时提供更精确的诊断,并且很少给出令人惊讶的求解结果。