在 Conan 包中供应商依赖

警告

此功能为实验性功能,可能会有破坏性更改。更多信息请参阅Conan 稳定性部分。

从 Conan 2.4 开始,可以创建和使用完全供应商依赖的 Conan 包,也就是说,它们完全隐藏并隔离了其依赖项,使其消费者无法访问。这在几种不同的情况下很有用:

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

  • 在项目的不同部分之间引入严格的解耦。

要使包供应商其依赖项,请在其配方中定义以下属性:

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

   vendor = True

   requires = "somedep/1.2"

当有了这个配方后,我们可以使用正常的 conan create . 来创建其二进制文件。但是,当我们将此包用作其他包的依赖项时,其依赖项将完全不可见。图表甚至不会展开 somedep/1.2 依赖项。对于消费者来说,这个依赖项甚至不需要在远程可用,它不会被检查。

一些重要说明

  • 供应商依赖的包打算始终以二进制形式使用。

  • 供应商包的依赖项始终形成一个完全私有且隔离的依赖项图,与使用此包的其余依赖项图解耦。

  • 供应商包及其用户有责任确保供应商依赖项不会发生冲突。例如,如果一个供应商包将 libssl.a 作为静态库在其包中进行常规复制,而图中的另一个包也提供了 libssl,则会发生冲突,Conan 无法检测到,因为 libssl.a 是供应商包作为包的内部实现细节,但没有明确建模。可以使用 provides 等机制来实现此目的,但配方作者有责任考虑到这一点。

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

  • 消费者 conanfile.py 配方的常规 default_options 或选项值定义不会传播到供应商包,因为它们甚至不会展开其依赖项。

  • 如果供应商包的二进制文件丢失和/或用户请求从源代码构建该包,Conan 将会失败,并引发一个错误,说明无法构建它。

  • 为了允许展开私有依赖项,可以激活 tools.graph:vendor=build 配置。在这种情况下,将计算并展开包的私有依赖项图,并且将允许构建该包。