在 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
配置。如果是这种情况,将计算并扩展包的私有依赖关系图,并允许构建该包。