除非必要,如何避免使用 conda-forge 包?
How to avoid using conda-forge packages unless necessary?
在从 conda-forge 安装单个软件包时,我 运行 遇到了 conda 的一个小但烦人的问题。通常我会 运行 像这样:
conda install -c conda-forge somepackage
这会导致使用 conda-forge 频繁更新其他软件包:几乎总是 ca-certificates、certifi 和 openssl;有时还有 python、numpy 等主要软件包(全部来自 conda-forge)。我怀疑这些更新并不是绝对必要的;这些包使用一些逻辑按照“为了安装最新版本的 somepackage 我需要 python>=3.8 但当前的 python 是 3.7;我可以使用 conda-forge,所以我将从 conda-forge 获取最新的 python,它比默认的更新。
我想要完成的是:安装任何版本的一些包(不一定是最新的)同时安装尽可能少来自康达锻造。特别是,如果在保留已安装的软件包和升级之间做出选择,我总是想保留;如果在默认通道和 conda-forge 之间有一个选择,我总是想要默认(即使这些选择导致我试图安装的新软件包的旧版本结束,and/or 他们的新依赖 -但如果它们导致无法安装,则不会。
我该如何完成?
how do I tell conda "don't upgrade dependencies"
可以使用 conda install --freeze-installed PACKAGE...
(documentation) to prevent conda from updating packages that are already installed. This does not, however, seem to prevent updating of packages under the aggressive_update_packages
key of conda's config. The default packages there are ca-certificates
, certifi
, and openssl
(see the default configuration)。可以使用
检查自己的配置
conda config --show aggressive_update_packages
install any version of somepackage (not necessarily latest) while installing as little as possible from conda-forge
根据 the conda documentation on managing channels,可以通过将 conda-forge
频道放在频道列表的底部并在 conda 的配置中设置 channel_priority: strict
来做到这一点。
With strict channel priority, packages in lower priority channels are not considered if a package with the same name appears in a higher priority channel.
“管理频道”页面建议将 strict 设置为默认值,并指示 conda 5.x 将 strict 设置为 channel_priority
的默认值。
可以将以下内容写入他们的 ~/.condarc
文件:
channel_priority: strict
channels:
- defaults
- conda-forge
但是,如果在 conda config
中使用 -c/--channel
选项,该频道将优先于任何其他频道。因此,如果像上面那样设置他们的 conda 配置但使用 conda install -c conda-forge numpy
,那么 numpy
将从 conda-forge
.
安装
总的来说,我赞同中的结论:定义合理的全局通道优先级并尽量避免通过--channel|-c
参数使用ad hoc规范.
还有一些额外的选项可能值得指出:
使用
指定特定包应来自给定频道
conda install conda-forge::somepackage
这不会改变通道优先级。
在install
命令中明确列出通道优先级:
conda install -c defaults -c conda-forge somepackage
其中 默认值 具有最高优先级。
通过 YAML 文件定义和操作环境。 YAML 包含一个频道部分,因此您可以明确说明优先级。如果您在环境中需要一个新包,可以将其添加到 YAML - 比方说 env.yaml
- 并且可以使用
将编辑转移到环境中
conda env update -f env.yaml
在从 conda-forge 安装单个软件包时,我 运行 遇到了 conda 的一个小但烦人的问题。通常我会 运行 像这样:
conda install -c conda-forge somepackage
这会导致使用 conda-forge 频繁更新其他软件包:几乎总是 ca-certificates、certifi 和 openssl;有时还有 python、numpy 等主要软件包(全部来自 conda-forge)。我怀疑这些更新并不是绝对必要的;这些包使用一些逻辑按照“为了安装最新版本的 somepackage 我需要 python>=3.8 但当前的 python 是 3.7;我可以使用 conda-forge,所以我将从 conda-forge 获取最新的 python,它比默认的更新。
我想要完成的是:安装任何版本的一些包(不一定是最新的)同时安装尽可能少来自康达锻造。特别是,如果在保留已安装的软件包和升级之间做出选择,我总是想保留;如果在默认通道和 conda-forge 之间有一个选择,我总是想要默认(即使这些选择导致我试图安装的新软件包的旧版本结束,and/or 他们的新依赖 -但如果它们导致无法安装,则不会。
我该如何完成?
how do I tell conda "don't upgrade dependencies"
可以使用 conda install --freeze-installed PACKAGE...
(documentation) to prevent conda from updating packages that are already installed. This does not, however, seem to prevent updating of packages under the aggressive_update_packages
key of conda's config. The default packages there are ca-certificates
, certifi
, and openssl
(see the default configuration)。可以使用
conda config --show aggressive_update_packages
install any version of somepackage (not necessarily latest) while installing as little as possible from conda-forge
根据 the conda documentation on managing channels,可以通过将 conda-forge
频道放在频道列表的底部并在 conda 的配置中设置 channel_priority: strict
来做到这一点。
With strict channel priority, packages in lower priority channels are not considered if a package with the same name appears in a higher priority channel.
“管理频道”页面建议将 strict 设置为默认值,并指示 conda 5.x 将 strict 设置为 channel_priority
的默认值。
可以将以下内容写入他们的 ~/.condarc
文件:
channel_priority: strict
channels:
- defaults
- conda-forge
但是,如果在 conda config
中使用 -c/--channel
选项,该频道将优先于任何其他频道。因此,如果像上面那样设置他们的 conda 配置但使用 conda install -c conda-forge numpy
,那么 numpy
将从 conda-forge
.
总的来说,我赞同--channel|-c
参数使用ad hoc规范.
还有一些额外的选项可能值得指出:
使用
指定特定包应来自给定频道conda install conda-forge::somepackage
这不会改变通道优先级。
在
install
命令中明确列出通道优先级:conda install -c defaults -c conda-forge somepackage
其中 默认值 具有最高优先级。
通过 YAML 文件定义和操作环境。 YAML 包含一个频道部分,因此您可以明确说明优先级。如果您在环境中需要一个新包,可以将其添加到 YAML - 比方说
将编辑转移到环境中env.yaml
- 并且可以使用conda env update -f env.yaml