本文档翻译自:https://docs.conan.io/en/latest/creating_packages/define_abi_compatibility.html#enabling-full-transitivity-in-package-id-modes

    :::success Waring
    这将成为将来的默认行为(Conan 2.0)。 建议在可能的情况下激活它(它可能需要重建一些软件包,因为它们的软件包ID会更改) :::

    当一个包在其package_id()方法中声明它不受其依赖项影响时,它将传播到该包的间接使用者。 有几种方法可以完成此操作:self.info.header_only()self.info.requires.clear()self.info.requires.remove [" dep"]self.info.requires.unrelated_mode(), 例如。

    让我们使用self.Info.header_only() 帮助程序,在讨论中假设它是仅包含头文件。此仅标头包具有单个依赖项,这是一个静态库。然后,使用不同于默认值的包模式的仅标头库的下游使用者也应受到上游传递性依赖关系的影响。假设我们有以下场景:

    • app/1.0 取决于pkgc/1.0pkga/1.0
    • pkgc/1.0 仅取决于pkgb/1.0
    • pkgb/1.0 依赖于pkga/1.0,并在其package_id() 中定义self.Info.header_only()
    • 我们正在使用full_version_mode
    • 现在我们创建一个新的pkga/2.0,它的标题有一些变化,这需要针对它重建pkgc/1.0
    • app/1.0 现在取决于 'pkgc/1.0pkga/2.0

    在package_id modes 中启用完全传递性 - 图1
    使用默认行为,仅头pkgbpkgc与上游更改效果隔离开来。根据pkga/1.0pkga/1.0,我们为pkgc/2.0 获得的包id PIDC1完全相同。
    如果我们希望full_version_mode是完全可传递的,而与包的本地包id模式无关,则可以在conan.conf部分中对其进行配置。总之,您可以激活general.full_transitive_package_id配置 ($ conan config set general.full_transitive_package_id=1)。
    如果我们这样做,那么pkgc/1.0 将计算两个不同的包id,一个用于pkga/1.0 (PIDC1),另一个用于与pkga/2.0 (PIDC2) 链接。