除非必要,如何避免使用 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规范.

还有一些额外的选项可能值得指出:

  1. 使用

    指定特定包应来自给定频道
     conda install conda-forge::somepackage
    

    这不会改变通道优先级。

  2. install命令中明确列出通道优先级:

     conda install -c defaults -c conda-forge somepackage
    

    其中 默认值 具有最高优先级。

  3. 通过 YAML 文件定义和操作环境。 YAML 包含一个频道部分,因此您可以明确说明优先级。如果您在环境中需要一个新包,可以将其添加到 YAML - 比方说 env.yaml - 并且可以使用

    将编辑转移到环境中
     conda env update -f env.yaml