除非必要,如何避免使用 conda-forge 软件包?

问题描述

从 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,它比认的要新”。

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

我该如何实现?

解决方法

我如何告诉 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 来做到这一点。

对于严格的渠道优先级,如果同名的包裹出现在较高优先级渠道中,则不会考虑较低优先级渠道中的包裹。

“管理频道”页面建议将严格设置为默认值,并指示 conda 5.x 将严格设置为 channel_priority 的默认值。

可以将以下内容写入他们的 ~/.condarc 文件:

channel_priority: strict
channels:
  - defaults
  - conda-forge

但是,如果在 -c/--channel 中使用 conda config 选项,则该频道将优先于任何其他频道。因此,如果将他们的 conda 配置设置为如上但使用 conda install -c conda-forge numpy,则 numpy 将从 conda-forge 安装。

,

总的来说,我赞同 @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
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...