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