如何计算 package_id
¶
让我们以一些软件包为例,并列出其二进制文件,例如
$ conan list "zlib/1.2.13:*" -r=conancenter
Local Cache
zlib
zlib/1.2.13
revisions
97d5730b529b4224045fe7090592d4c1 (2023-08-22 02:51:57 UTC)
packages
d62dff20d86436b9c58ddc0162499d197be9de1e # package_id
info
settings
arch: x86_64
build_type: Release
compiler: apple-clang
compiler.version: 13
os: Macos
options
fPIC: True
shared: False
abe5e2b04ea92ce2ee91bc9834317dbe66628206 # package_id
info
settings
arch: x86_64
build_type: Release
compiler: gcc
compiler.version: 11
os: Linux
options
shared: True
我们可以看到 zlib/1.2.13
最新配方修订版有多个二进制文件。每个二进制文件都由其自己的 package_id
标识,在其下方,我们可以在 info
下看到该二进制文件的一些信息。此信息用于计算 package_id
。每当此信息发生更改时,例如架构,或者是静态库还是共享库,都会计算新的 package_id
,因为它表示不同的二进制文件。
package_id
计算为 conaninfo.txt
文件的 sha1 哈希值,其中包含上面显示的 info
。显示此类文件相对容易
$ conan install --requires=zlib/1.2.13 --build=missing
# Use the <package-id> listed in the install
$ conan cache path zlib/1.2.13:<package-id>
# cat the conaninfo.txt in the returned path
$ cat <path>/conaninfo.txt
[settings]
arch=x86_64
build_type=Release
compiler=msvc
compiler.runtime=dynamic
compiler.runtime_type=Release
compiler.version=193
os=Windows
[options]
shared=False
$ sha1sum <path>/conaninfo.txt
# Should be the "package_id"!
package_id
是软件包内 conaninfo.txt
文件的 sha1 校验和。您可以使用 sha1sum
实用程序进行验证。
如果我们现在看一下 openssl
的二进制文件,我们可以看到类似的情况
$ conan list "openssl/3.1.2:*" -r=conancenter
conancenter
openssl
openssl/3.1.2
revisions
8879e931d726a8aad7f372e28470faa1 (2023-09-13 18:52:54 UTC)
packages
0348efdcd0e319fb58ea747bb94dbd88850d6dd1 # package_id
info
settings
arch: x86_64
build_type: Release
compiler: apple-clang
compiler.version: 13
os: Macos
options
386: False
...
shared: True
requires
zlib/1.3.Z
我们现在看到 conaninfo.txt
包含一个新的部分,即 requires
部分。发生这种情况是因为 openssl
依赖于 zlib
,并且由于 C 和 C++ 编译模型,依赖项会影响使用它们的二进制文件。一些示例是在使用来自依赖项的 #include
头文件的内联或模板时。
展开上面的图片
可以看出,即使 settings
和 options
相同,如果依赖项版本发生变化,也会获得不同的二进制文件。在下一节中,版本如何影响 package_id 将进行说明。