在 Conan 包中绑定依赖项

警告

此功能是实验性的,可能会发生重大更改。有关更多信息,请参见 Conan 稳定性 部分。

从 Conan 2.4 开始,可以创建和使用完全绑定其依赖项的 Conan 包,也就是说,它们完全隐藏和隔离了其依赖项,使其对使用者不可见。 这在某些不同的情况下可能很有用

  • 与其他组织共享 Conan 包时,这些组织绑定(复制、嵌入或链接)依赖项,因此其包的使用者不必访问这些依赖项,并且期望他们始终使用共享的预编译二进制文件。

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

要使包绑定其依赖项,请在其 recipe 中定义以下属性

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

   vendor = True

   requires = "somedep/1.2"

当我们拥有此 recipe 时,可以使用普通的 conan create . 创建其二进制文件。但是,当我们使用此包作为其他包的依赖项时,其依赖项将完全不可见。图形甚至不会展开 somedep/1.2 依赖项。 此依赖项甚至不需要在消费者的远程仓库中可用,它将不会被检查。

一些重要的注意事项

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

  • 绑定包的依赖项始终构成完全私有和隔离的依赖关系图,与使用此包的依赖关系图的其余部分分离。

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

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

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

  • 如果绑定包二进制文件丢失和/或用户请求从源码构建此类包,则 Conan 将失败,并引发无法构建它的错误。

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