我希望有两个环境:一个生产环境,它是测试环境的一个严格子集。如何使用Conda (或micromamba)实现这一目标?
测试需要一些额外的实用程序,而这些实用程序不需要捆绑在产品坞映像中。其主要思想是确保生产安装中的子依赖项与在同伴环境中测试的版本完全相同。
例如可能性:
发布于 2021-10-14 00:25:05
向相反的方向(测试-> prod)到my previous answer是有点棘手的。基本上,我们希望首先解决测试环境,然后只使用来自该环境的包版本来创建生产环境。下面是我检查的一种方法将有效,尽管这是不标准的。
临时包缓存+离线解决
其主要思想是使用临时包缓存,以便在创建pkg_prod环境时,只有安装在测试环境中的包才可用于解决问题步骤。我们开始:
## create a temporary directory for package cache
tmp_pkg_cache=$(mktemp -d)
## create test environment (it uses both prod and test reqs)
CONDA_PKGS_DIRS=${tmp_pkg_cache} mamba create -n pkg_test \
--file requirements.prod.txt --file requirements.test.txt
## restrict prod env creation to packages in the tmp cache
CONDA_PKGS_DIRS=${tmp_pkg_cache} mamba create -n pkg_prod \
--file requirements.prod.txt --offline
## clean up cache
rm -rf ${tmp_pkg_cache}同样,如果需求发生变化,我将删除环境并重新运行这些步骤。请注意,这种方法忽略了现有的包缓存,因此它将下载每个包--尽管如果运行程序是CI的一部分,情况可能也是如此。
发布于 2021-10-13 16:46:04
Conda不以任何有用的方式直接支持嵌套环境。但是,有一些定义良好的步骤将生成具有相同版本的公共包的环境。下面是一个可能的程序。
克隆+冷冻安装
为了给出一个具体的示例,以及一个在其通用性中使用Conda的示例(这不是以Python为中心的),让我们考虑一个的开发项目--一个R包。假设我们有两组要求:
requirements.prod.txt
r-base=4.0
r-magrittr
r-dplyrrequirements.test.txt
r-testthat
r-usethis以下命令将创建两个环境,其中一个环境(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如果您更改了需求,最好是重新创建环境。我推荐Mamba,因为它最小化了解决时间,在事情出错时提供了更精确的诊断,并且很少给出令人惊讶的解决结果。
https://stackoverflow.com/questions/69548005
复制相似问题