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