在 Conan 包中 vendor 依赖项¶
警告
此功能是实验性的,可能会有破坏性更改。有关更多信息,请参阅Conan 稳定性部分。
从 Conan 2.4 开始,可以创建和使用完全 vendor 其依赖项的 Conan 包,也就是说,它们完全隐藏并隔离其依赖项,使其对消费者不可见。 这在某些不同的情况下可能很有用:
当与其他组织共享 vendor(复制、嵌入或链接)依赖项的 Conan 包时,这样他们的包的消费者就不需要访问这些依赖项,并且目的是让他们始终使用共享的预编译二进制文件。
为了在项目的各个部分之间引入硬解耦。
要使包 vendor 其依赖项,请在其 recipe 中定义以下属性:
class MyPkg(ConanFile):
name = "mypkg"
version = "0.1"
vendor = True
requires = "somedep/1.2"
当我们有这个 recipe 时,我们可以使用普通的 conan create .
创建其二进制文件。但是,当我们使用此包作为其他包的要求时,其依赖项将完全不可见。 图甚至不会展开 somedep/1.2
要求。 消费者甚至不需要在远程仓库中提供此依赖项,也不会对其进行检查。
一些重要的注意事项:
vendor 其依赖项的包旨在始终以二进制形式使用。
vendor 包的依赖项始终构成完全私有和隔离的依赖关系图,与使用此包的其余依赖关系图解耦。
vendor 包及其用户有责任保证 vendor 的依赖项不会冲突。 例如,如果一个 vendor 包 vendor 了
libssl.a
作为一个静态库,并在其包中对其进行常规复制,并且图中还有另一个包也提供了libssl
,则会发生冲突,Conan 无法检测到该冲突,因为libssl.a
是作为包的内部实现细节 vendor 的,而不是显式建模的。 可以为此目的使用诸如provides
之类的机制,但这由 recipe 作者负责考虑。定义了
vendor=True
的包的package_id
完全独立于其依赖项。 依赖项版本永远不会影响 vendor 包的package_id
,因此务必注意,vendor 包的版本代表完整的私有依赖关系图。来自消费者
conanfile.py
recipes 的常规default_options
或选项值定义不会通过 vendor 包传播,因为它们甚至不展开其依赖项。如果 vendor 包二进制文件丢失和/或用户请求从源代码构建此类包,Conan 将失败,并引发错误,提示无法构建它。
为了允许展开私有依赖关系,可以激活
tools.graph:vendor=build
配置。 如果是这种情况,将计算和展开包的私有依赖关系图,并且允许构建该包。