【问题标题】:How to manage development dependencies in Conda?如何在 Conda 中管理开发依赖项?
【发布时间】:2021-10-12 23:23:47
【问题描述】:

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

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

示例可能性:

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

【问题讨论】:

    标签: conda continuous-deployment packaging


    【解决方案1】:

    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 的一部分,那么无论如何都可能是这种情况。

    【讨论】:

    • create --clone && uninstall --prune 相比,结果(--offline 与预备缓存)有何不同? (我猜后者可以使用缓存,但卸载会在环境中留下额外的混乱,或者如果还有 PyPI 依赖项会中断?)
    • @benjimin 理论上它应该可以工作,但我最近几次联系--prune 却没有用——无论是 Conda 还是 Mamba 实现。不过,我想我最近(过去几周)看到了 Mamba 回购协议。
    • 包目录配置为documented here
    【解决方案2】:

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

    克隆 + 冻结安装

    举一个具体的例子,并且在一般情况下使用 Conda(它不是以 Python 为中心的),让我们考虑一个一个 R 包的开发项目。假设我们有两组要求:

    requirements.prod.txt

    r-base=4.0
    r-magrittr
    r-dplyr
    

    requirements.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,因为它可以最大限度地缩短求解时间,在出现问题时提供更精确的诊断,并且很少给出令人惊讶的求解结果。

    【讨论】:

    • 接近 prod→test 方向(克隆和冻结安装)的一个问题是,测试工具可能需要比已为 prod 环境安装的子依赖项的旧版本,从而破坏/防止测试安装。是否还有一个定义明确的程序来代替测试→生产方向?
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2012-02-19
    • 2022-12-05
    • 2011-01-28
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多