【问题标题】:How to avoid using conda-forge packages unless necessary?除非必要,否则如何避免使用 conda-forge 包?
【发布时间】:2021-04-05 13:22:37
【问题描述】:

从 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,所以我会得到最新的 python来自 conda-forge,它比默认的更新”。

我想要完成的是:安装 any 版本的 somepackage(不一定是最新的),同时从 conda-forge 安装 尽可能少的。特别是,如果在保留已安装的软件包和升级之间进行选择,我总是想保留;如果在默认通道和 conda-forge 之间有选择,我总是想要默认(即使这些选择导致我尝试安装的新软件包的旧版本和/或它们的新依赖项 - 但不是如果它们导致无法安装)。

我该如何做到这一点?

【问题讨论】:

  • @jacub 很有帮助,但我认为它似乎并不能完全解决这个问题。 1. 当使用带有 -c 的频道(而不是 conda config --append channels 等)时,它在列表中的哪个位置?和 2. 通道优先级如何允许诸如“使用来自较低优先级通道的更高版本包,但前提是需要安装请求的包(而不是请求包的最新版本)”这样的场景
  • @jacub 对我来说可能最好的事情是首先使用 channel_priority=strict 和默认频道(尽管有时可能会使安装失败,否则可能会成功)。另一个问题,我如何告诉 conda“不要升级依赖项”(不管频道)

标签: python anaconda conda conda-forge


【解决方案1】:

我如何告诉 conda“不要升级依赖项”

可以使用conda install --freeze-installed PACKAGE... (documentation) 来防止 conda 更新已安装的软件包。但是,这似乎并不能阻止更新 conda 配置的 aggressive_update_packages 键下的软件包。默认包有ca-certificatescertifiopenssl(参见default configuration)。可以检查自己的配置与

conda config --show aggressive_update_packages

安装 somepackage 的任何版本(不一定是最新的),同时尽可能少地从 conda-forge 安装

根据the conda documentation on managing channels,可以通过将conda-forge 频道放在频道列表的底部并在conda 的配置中设置channel_priority: strict 来做到这一点。

对于严格的通道优先级,如果具有相同名称的包出现在较高优先级的通道中,则不考虑较低优先级通道中的包。

“管理频道”页面建议将 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 安装。

【讨论】:

    【解决方案2】:

    总的来说,我赞同@jakub's answer 中的结论:定义一个合理的全局通道优先级,并尽量避免通过--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
      

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多