如何在固定版本上冻结 conda
How to freeze conda on a fixed version
我被要求查看一些关于 python 的开发操作资料,我有点卡住了。我正在工作的网络没有连接到互联网,所以我一直在设置 Nexus 存储库以引入 docker、java 和 pypi 的依赖项,其他开发人员可以在本地访问和下拉这些依赖项。但是,他们开始越来越多地使用 conda,我们在开发网络上使用固定版本以匹配交付网络。
我正在尝试使用 nexus 的 conda repos,尽管每次我尝试安装某些东西时它都会尝试更新其他所有内容,包括 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 设置,如果这比我做的更简单,我深表歉意。
Conda 如何解决
Conda 始终首先尝试在不更改现有包的情况下解决安装指令(即,它首先使用 --freeze-installed
标志运行)并且只有在可以的情况下才会进行完整解决(您所看到的) ' 查找已在环境中满足其所有依赖项的所请求包的任何版本。也就是说,这个结果意味着你所要求的是不可能的。或者,如果您想要一个有效的环境,至少不要通过 CLI。1
问题的核心是,即使只有一个依赖需要更新,也没有中间模式表明你想尽量减少更改的总数(我认为这实际上是一个不错的增强)。 Conda只有两种求解模式:
- 别无改变(
--freeze-installed
)。
- 允许更新所有依赖项(
--update-deps
)。
例外情况是 aggressive_update_packages 和 auto_update_conda,它将始终尝试每当环境发生变化时更新。但是您似乎已经意识到可以通过配置设置禁用它们。2
手动依赖更新
这并不意味着您希望完成的事情是不可能的,而是没有一种干净的方法可以通过 CLI 将其自动化。相反,您可能需要手动跟踪需要更新的依赖项(例如,conda search cudatoolkit --info
),首先更新它们(conda install
具有特定版本),然后再次尝试安装您的包。我强烈建议首先确定您计划安装的 cudatoolkit
的确切版本,否则 conda search cudatoolkit --info
会包含太多信息。
包固定
对于您确实想要绝对修复的软件包,有 package pinning。您可以为 conda
、python
和其他核心包执行此操作。
基地环境
我发现 base 环境(具有 conda
包的环境)完全发生了变化,这有点奇怪。相反,我希望软件工程师始终使用 non-base 环境进行开发和生产。创建新环境很容易,可以使用版本控制的 YAML 文件定义它们,通过在每个项目或每个 task-type 基础上创建它们来模块化地使用它们,并且可以改变它们而不必担心影响 Conda 基础设施。但是,我对您的设置并不完全清楚,因此此评论可能不适用。
[1] 如果一个人不关心有效性(对于生产来说可能不是一个好主意)那么总会有 --no-deps
标志.
[2] 默认的 aggressive_update_packages 软件包经常容易受到攻击(例如,openssl
),因此请仔细考虑让它们过时的含义。
我被要求查看一些关于 python 的开发操作资料,我有点卡住了。我正在工作的网络没有连接到互联网,所以我一直在设置 Nexus 存储库以引入 docker、java 和 pypi 的依赖项,其他开发人员可以在本地访问和下拉这些依赖项。但是,他们开始越来越多地使用 conda,我们在开发网络上使用固定版本以匹配交付网络。
我正在尝试使用 nexus 的 conda repos,尽管每次我尝试安装某些东西时它都会尝试更新其他所有内容,包括 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 设置,如果这比我做的更简单,我深表歉意。
Conda 如何解决
Conda 始终首先尝试在不更改现有包的情况下解决安装指令(即,它首先使用 --freeze-installed
标志运行)并且只有在可以的情况下才会进行完整解决(您所看到的) ' 查找已在环境中满足其所有依赖项的所请求包的任何版本。也就是说,这个结果意味着你所要求的是不可能的。或者,如果您想要一个有效的环境,至少不要通过 CLI。1
问题的核心是,即使只有一个依赖需要更新,也没有中间模式表明你想尽量减少更改的总数(我认为这实际上是一个不错的增强)。 Conda只有两种求解模式:
- 别无改变(
--freeze-installed
)。 - 允许更新所有依赖项(
--update-deps
)。
例外情况是 aggressive_update_packages 和 auto_update_conda,它将始终尝试每当环境发生变化时更新。但是您似乎已经意识到可以通过配置设置禁用它们。2
手动依赖更新
这并不意味着您希望完成的事情是不可能的,而是没有一种干净的方法可以通过 CLI 将其自动化。相反,您可能需要手动跟踪需要更新的依赖项(例如,conda search cudatoolkit --info
),首先更新它们(conda install
具有特定版本),然后再次尝试安装您的包。我强烈建议首先确定您计划安装的 cudatoolkit
的确切版本,否则 conda search cudatoolkit --info
会包含太多信息。
包固定
对于您确实想要绝对修复的软件包,有 package pinning。您可以为 conda
、python
和其他核心包执行此操作。
基地环境
我发现 base 环境(具有 conda
包的环境)完全发生了变化,这有点奇怪。相反,我希望软件工程师始终使用 non-base 环境进行开发和生产。创建新环境很容易,可以使用版本控制的 YAML 文件定义它们,通过在每个项目或每个 task-type 基础上创建它们来模块化地使用它们,并且可以改变它们而不必担心影响 Conda 基础设施。但是,我对您的设置并不完全清楚,因此此评论可能不适用。
[1] 如果一个人不关心有效性(对于生产来说可能不是一个好主意)那么总会有 --no-deps
标志.
[2] 默认的 aggressive_update_packages 软件包经常容易受到攻击(例如,openssl
),因此请仔细考虑让它们过时的含义。