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,因为它代表了不同的二进制文件。

../../_images/conan_package_id.png

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 头文件中的内联函数或模板。

展开上图

../../_images/conan_package_id_full.png

正如可以看到的,即使 settingsoptions 相同,如果依赖项的版本发生变化,也将获得不同的二进制文件。下一节 版本如何影响 package_id 对此进行了解释。