Conan 包中的依赖项 Vendor 化

警告

此功能为实验性功能,可能会有重大变更。有关更多信息,请参阅 Conan 稳定性 章节。

从 Conan 2.4 开始,可以创建和使用完全 vendor 化其依赖项的 Conan 包,即完全对其使用者隐藏和隔离其依赖项。这在某些不同情况下可能很有用

  • 当与其他组织共享 Conan 包时,这些组织 vendor 化(复制、嵌入或链接)依赖项,因此其包的使用者无需访问这些依赖项,并且目的是让他们始终使用共享的预编译二进制文件。

  • 为了在项目的各个部分之间引入硬解耦。

要使包 vendor 化其依赖项,请在其配方中定义以下属性

class MyPkg(ConanFile):
   name = "mypkg"
   version = "0.1"

   vendor = True

   requires = "somedep/1.2"

当我们有这个配方时,我们可以使用正常的 conan create . 创建其二进制文件。但是,当我们使用此包作为其他包的依赖项时,其依赖项将完全不可见。依赖关系图甚至不会展开 somedep/1.2 依赖项。使用者甚至不需要在远程仓库中提供此依赖项,也不会对其进行检查。

一些重要的注意事项

  • Vendor 化其依赖项的包旨在始终以二进制形式使用。

  • vendor 化包的依赖项始终形成完全私有和隔离的依赖关系图,与使用此包的其余依赖关系图解耦。

  • vendor 化包及其用户有责任保证 vendor 化的依赖项不会冲突。例如,如果一个 vendor 化包将 libssl.a 作为静态库 vendor 化,并在其包中对其进行常规复制,并且依赖关系图中还有另一个包也提供了 libssl,则会发生冲突,Conan 无法检测到该冲突,因为 libssl.a 是作为包的内部实现细节 vendor 化的,但未显式建模。诸如 provides 之类的机制可以用于此目的,但这由配方作者负责考虑。

  • 定义了 vendor=True 的包的 package_id 完全独立于其依赖项。依赖项版本永远不会影响 vendor 化包的 package_id,因此重要的是要注意 vendor 化包的版本代表完整的私有依赖关系图。

  • 来自使用者 conanfile.py 配方中的常规 default_options 或选项值定义不会传播到 vendor 化包,因为它们甚至不展开其依赖项。

  • 如果 vendor 化包的二进制文件丢失,或者用户请求从源代码构建此类包,Conan 将会失败,并引发错误,表明无法构建它。

  • 要允许展开私有依赖项,可以激活 tools.graph:vendor=build 配置。如果激活了该配置,则将计算和展开包的私有依赖关系图,并允许构建包。