【问题标题】:How to freeze conda on a fixed version如何在固定版本上冻结 conda
【发布时间】:2021-01-11 23:56:37
【问题描述】:

我被要求查看一些关于 python 的开发操作的东西,我有点卡住了。我正在工作的网络没有连接互联网,所以我一直在设置 Nexus 存储库以引入其他开发人员可以在本地访问和下拉的 docker、java 和 pypi 的依赖项。然而,他们越来越多地开始使用 conda,我们在开发网络上使用了一个固定版本来匹配交付网络。

我正在尝试使用 nexus 的 conda 存储库,尽管每次我尝试安装某些东西时,它都会尝试更新其他所有内容,包括以下 python 和 conda 版本:

      conda version : 4.8.3
conda-build version : 3.18.11
     python version : 3.8.3.final.0

我已将 .condarc 文件编辑为:

channels:
  - http://master:8041/repository/anaconda-proxy/main/
  - http://master:8041/repository/conda-forge/
remote_read_timeout_secs: 1200.0
auto_update_conda: false
channel_priority: false

但是,每次我尝试安装一些东西来缓存依赖项时,我都会得到一个巨大的更新列表。例如:

conda install cudatoolkit
<snip>
The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    alabaster-0.7.12           |             py_0          16 KB  http://master:8041/repository/anaconda-proxy/main
    anaconda-client-1.7.2      |           py38_0         172 KB  http://master:8041/repository/anaconda-proxy/main
    anaconda-project-0.8.4     |             py_0         210 KB  http://master:8041/repository/anaconda-proxy/main
    argh-0.26.2                |           py38_0          36 KB  http://master:8041/repository/anaconda-proxy/main
.....

任何建议都会很棒。我添加了 auto_update_conda 和 channel_priority 标志,但无济于事。提前致谢。

附加信息: 我是一名 Java 开发人员,我只使用一点 python,所以我对 anaconda 设置不是很熟悉,所以如果这比我做的简单,我深表歉意。

【问题讨论】:

    标签: python anaconda dependencies conda nexus


    【解决方案1】:

    Conda 如何解决

    Conda 总是首先尝试在不更改现有软件包的情况下解决安装指令(即,它首先使用 --freeze-installed 标志运行)并且只有在找不到任何软件包时才会继续进行完全解决(您所看到的)已在环境中满足所有依赖项的请求包的版本。也就是说,这个结果意味着你所要求的是不可能的。或者,如果您想要一个有效的环境,至少不要通过 CLI。1

    问题的核心在于,即使只有一个依赖项需要更新,也没有中间模式来表明您希望最小化更改的总数(我认为这实际上是一个很好的增强)。 Conda 只有两种求解模式:

    1. 别无其他改变 (--freeze-installed)。
    2. 允许更新所有依赖项 (--update-deps)。

    aggressive_update_packagesauto_update_conda 是个例外,只要环境发生突变,它总是会尝试更新它们。但您似乎已经意识到可以通过配置设置禁用这些功能。2

    手动更新依赖

    这并不意味着您希望完成的事情是不可能的,而是没有一种干净的方法可以通过 CLI 实现自动化。相反,您可能需要手动跟踪需要更新的依赖项(例如,conda search cudatoolkit --info),首先更新它们(conda install 使用特定版本),然后再次尝试安装您的包。我强烈建议您首先确定您计划安装的 cudatoolkit 的确切版本,否则 conda search cudatoolkit --info 将提供太多信息。

    包固定

    对于您确实想要完全修复的软件包,有package pinning。您可以为condapython 和其他核心包执行此操作。

    基础环境

    我觉得 base 环境(具有conda 包的环境)发生了突变有点奇怪。相反,我希望软件工程师始终使用非基础环境进行开发和生产。创建新环境很容易,可以使用受版本控制的 YAML 文件定义它们,通过在每个项目或每个任务类型的基础上创建它们来模块化地使用它们,并且可以对它们进行变异而不用担心影响 Conda 基础设施。但是,我对您的设置并不完全清楚,因此此评论可能不适用。


    [1] 如果不关心有效性(可能不是生产的好主意),那么总会有 --no-deps 标志。

    [2] 默认的 aggressive_update_packages 包是那些经常容易受到攻击的包(例如,openssl),因此请仔细考虑离开的影响它们已经过时了。

    【讨论】:

    • 哇,感谢您提供如此详细的答案。当我回到客户端工作时,我会玩。我非常感谢这里的细节。 :-)
    • @mins 过去几年我一直在关注问题和拉取请求,并且每当我看到(或 SO 用户报告)意外行为时都会去阅读代码,以找出实际的实现.也许我应该在今年开始抽出一些时间将其中一些信息提交给文档,我同意这并不总是有帮助,更不用说实现透明了。
    猜你喜欢
    • 2020-05-10
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2019-07-26
    相关资源
    最近更新 更多