在 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 配置。在这种情况下,包的私有依赖图将被计算和展开,并且包将被允许构建。