管理 conda 和 pip 之间依赖关系的最佳实践
Best practice to manage dependencies between conda and pip
我正在开发一个 Python 库,它依赖于多个包。我正在努力寻找最直接的方法来管理具有以下约束的所有这些依赖关系:
- 其中一些依赖项仅作为 conda 包提供(从技术上讲,源是可用的,但构建过程不是我想要进入的)
- 其他依赖项只能通过 pip 获得
- 我需要在可编辑或开发者模式下安装我自己的库
- 我经常需要使依赖项保持最新
我当前的初始安装设置:
- 创建一个新的 conda 环境
- 使用
conda install ...
安装 conda-only 依赖项
- 使用
pip install -e .
安装我的库
至此,安装了一些包,现在由 conda 管理,其他包由 pip 管理。当我想更新我的环境时,我需要:
- 使用
conda update --all
更新环境的 conda 部分
- 手动更新环境的pip部分
我的问题是它不稳定:当我更新所有 conda 包时,它确保了它管理的包的一致性。但是,我不能保证整个环境保持一致,我刚刚意识到我错过了一些更新,因为我忘记检查环境的 pip 部分的更新。
最好的方法是什么?我想到了:
- 使用 conda 的 pip interoperability feature :这似乎可行,但我得到了一些可疑的结果,可能是因为我使用了 extras_require
- 由于 pip 可以看到 conda 包,因此初始安装是一致的,这意味着我可以在需要更新时简单地重新安装所有内容。这可行,但并不十分优雅。
the official documentation 中关于管理还需要 PyPI-sourced 或 pip
安装的本地包的 Conda 环境的建议是在 YAML 中定义所有依赖项(Conda 和 Pip)文件。类似于:
env.yaml
name: my_env
channels:
- defaults
dependencies:
- python=3.8
- numpy
- pip
- pip:
- some_pypi_only_pkg
- -e path/to/a/local/pkg
在这样的环境中更新的工作流程是更新 YAML 文件(我建议将其置于版本控制之下),然后创建一个新环境或使用
conda env update -f env.yaml
就个人而言,我倾向于创建新的环境,而不是改变(更新)现有环境,并在 YAML 中使用最小约束(即 >=version
)。创建新环境时,它应该自动拉取最新的一致包。另外,可以保留环境的先前实例,以防在开发生命周期中需要回归。
我正在开发一个 Python 库,它依赖于多个包。我正在努力寻找最直接的方法来管理具有以下约束的所有这些依赖关系:
- 其中一些依赖项仅作为 conda 包提供(从技术上讲,源是可用的,但构建过程不是我想要进入的)
- 其他依赖项只能通过 pip 获得
- 我需要在可编辑或开发者模式下安装我自己的库
- 我经常需要使依赖项保持最新
我当前的初始安装设置:
- 创建一个新的 conda 环境
- 使用
conda install ...
安装 conda-only 依赖项
- 使用
pip install -e .
安装我的库
至此,安装了一些包,现在由 conda 管理,其他包由 pip 管理。当我想更新我的环境时,我需要:
- 使用
conda update --all
更新环境的 conda 部分
- 手动更新环境的pip部分
我的问题是它不稳定:当我更新所有 conda 包时,它确保了它管理的包的一致性。但是,我不能保证整个环境保持一致,我刚刚意识到我错过了一些更新,因为我忘记检查环境的 pip 部分的更新。
最好的方法是什么?我想到了:
- 使用 conda 的 pip interoperability feature :这似乎可行,但我得到了一些可疑的结果,可能是因为我使用了 extras_require
- 由于 pip 可以看到 conda 包,因此初始安装是一致的,这意味着我可以在需要更新时简单地重新安装所有内容。这可行,但并不十分优雅。
the official documentation 中关于管理还需要 PyPI-sourced 或 pip
安装的本地包的 Conda 环境的建议是在 YAML 中定义所有依赖项(Conda 和 Pip)文件。类似于:
env.yaml
name: my_env
channels:
- defaults
dependencies:
- python=3.8
- numpy
- pip
- pip:
- some_pypi_only_pkg
- -e path/to/a/local/pkg
在这样的环境中更新的工作流程是更新 YAML 文件(我建议将其置于版本控制之下),然后创建一个新环境或使用
conda env update -f env.yaml
就个人而言,我倾向于创建新的环境,而不是改变(更新)现有环境,并在 YAML 中使用最小约束(即 >=version
)。创建新环境时,它应该自动拉取最新的一致包。另外,可以保留环境的先前实例,以防在开发生命周期中需要回归。