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