conda 安装的二进制文件不同于 anaconda.org

Binary file installed by conda differs from one on anaconda.org

conda install wgrib2=2.0.5=1 bin/ 文件夹中的二进制文件与 anaconda.org (1) 上的 tarball 中的二进制文件不同。这是预料之中的事情吗?

  1. https://anaconda.org/conda-forge/wgrib2/2.0.5/download/linux-64/wgrib2-2.0.5-1.tar.bz2

对于上下文,我在调试时遇到了这个问题 another issue

Conda 前缀编辑

不确定所有细节,但我的理解是某些1 二进制文件在链接到共享库时使用环境的前缀(即它的路径)。为了解决这个问题,Conda 使用占位符前缀构建二进制文件(参见 info/has_prefixinfo/paths.json 文件),然后在将其放置在环境位置之前替换二进制文件中的这个占位符。由于这涉及到编辑二进制文件,它将不再匹配原始的 sha256 和。

此外,由于环境位置是唯一的,在不同环境中安装相同版本的二进制文件将产生不同的哈希值。例如,使用 wgrib2 创建一个环境 foo,然后使用 conda create --clone foo 创建另一个环境 bar,给出两个不同的哈希值:

$ sha256sum envs/foo/bin/wgrib2 
ed77630abbfa150060b43219b233a6226b778a035120cd266cdc7082cf2b9d2b  envs/foo/bin/wgrib2

$ sha256sum envs/bar/bin/wgrib2 
92eef4bcdea0263c33b1dcfeb8d405e3147a09392b48675d45b444e16754ac06  envs/bar/bin/wgrib2

但是,仍在包缓存中的二进制文件版本(默认为 pkgs/)应该与您从 Anaconda Cloud 界面下载的版本相匹配,就像在 OP 中一样。我确认您的具体示例就是这种情况。


[1] 这是我最不清楚的地方:为什么有些二进制文件需要这个而其他二进制文件不需要。


附加信息

FWIW,这里是 运行 conda install 的相关部分,非常冗长。观察在验证步骤中,Conda 将原始二进制文件复制到环境下的临时位置,然后继续更新二进制文件以重写它应该解析链接库的位置。

Verifying transaction: ...working... 

TRACE conda.gateways.disk:mkdir_p(66): making directory /home/user/software/miniconda3/envs/foo/.condatmp
TRACE conda.core.path_actions:verify(417): copying /home/user/software/miniconda3/pkgs/wgrib2-2.0.5-1/bin/wgrib2 => /home/user/software/miniconda3/envs/foo/.\
condatmp/b994fd18-c6bd-46aa-ad74-29d6ce33a791
TRACE conda.gateways.disk.create:_do_copy(314): copying /home/user/software/miniconda3/pkgs/wgrib2-2.0.5-1/bin/wgrib2 => /home/user/software/miniconda3/envs/\
foo/.condatmp/b994fd18-c6bd-46aa-ad74-29d6ce33a791
TRACE conda.core.path_actions:verify(422): rewriting prefixes in /home/user/software/miniconda3/envs/foo/bin/wgrib2
TRACE conda.gateways.disk.update:update_file_in_place_as_binary(38): in-place update path locked for /spacex/home/user/software/miniconda3/envs/foo/.condatmp/b994f\
d18-c6bd-46aa-ad74-29d6ce33a791
done

Executing transaction: ...working... 

INFO conda.core.link:_execute_actions(742): ===> LINKING PACKAGE: conda-forge::wgrib2-2.0.5-1 <===
  prefix=/home/user/software/miniconda3/envs/foo
  source=/home/user/software/miniconda3/pkgs/wgrib2-2.0.5-1

TRACE conda.core.path_actions:execute(374): linking None => /home/user/software/miniconda3/envs/foo/bin
TRACE conda.gateways.disk:mkdir_p(66): making directory /home/user/software/miniconda3/envs/foo/bin
TRACE conda.core.path_actions:execute(447): linking /home/user/software/miniconda3/envs/foo/.condatmp/b994fd18-c6bd-46aa-ad74-29d6ce33a791 => /home/user/soft\
ware/miniconda3/envs/foo/bin/wgrib2
TRACE conda.gateways.disk.create:create_link(360): hard linking /home/user/software/miniconda3/envs/foo/.condatmp/b994fd18-c6bd-46aa-ad74-29d6ce33a791 => /home/f\
anslerm/software/miniconda3/envs/foo/bin/wgrib2
TRACE conda.core.path_actions:execute(900): creating linked package record /home/user/software/miniconda3/envs/foo/conda-meta/wgrib2-2.0.5-1.json
TRACE conda.gateways.disk.create:write_as_json_to_file(110): writing json to file /home/user/software/miniconda3/envs/foo/conda-meta/wgrib2-2.0.5-1.json