Deployers¶
Deployers 是一种促进文件从一个文件夹(通常是 Conan 缓存)复制到用户文件夹的机制。虽然 Conan 提供了三个内置的 Deployers(full_deploy、direct_deploy 和 runtime_deploy),但用户可以使用 conan config install 轻松管理自己的 Deployers。
Deployers 在生成器之前运行,并且可以更改目标文件夹。例如,如果 --deployer=full_deploy Deployer 在 CMakeDeps 之前运行,则 CMakeDeps 生成的文件将指向 full_deploy Deployer 在用户文件夹中复制的本地副本,而不是 Conan 缓存。可以通过提供多个 --deployer= 参数来指定多个 Deployers,并且它们将按照出现的顺序运行。
Deployers 可以是多配置的。重复运行 conan install . --deployer=full_deploy 针对不同的 profile 可以实现完全自包含的项目,包括所有工件、二进制文件和构建文件。该项目将完全独立于 Conan,并且不再需要它来构建。使用 --deployer-folder 参数来根据需要更改 Deployer 的基本文件夹输出路径。
内置 Deployers¶
警告
内置 Deployers 处于 预览 阶段。有关更多信息,请参阅 Conan 稳定性 部分。
full_deploy¶
将每个依赖项的每个包文件夹部署到您的 recipe 的 output_folder 中,基于
构建上下文
依赖项名称和版本
构建类型
构建架构
然后,每个依赖项将最终位于一个文件夹中,例如
[OUTPUT_FOLDER]/full_deploy/host/dep/0.1/Release/x86_64
请参阅 为开发人员使用创建 Conan 无关依赖项部署 中 full_deploy Deployer 的完整用法示例。
direct_deploy¶
与 full_deploy 相同,但仅处理您的 recipe 的直接依赖项。此 Deployer 将在树形文件夹中输出您的依赖项,例如
[OUTPUT_FOLDER]/direct_deploy/dep
runtime_deploy¶
自 Conan 2.5.0 起新增
将依赖项中的所有共享库和可执行文件(例如 .so、.dll 或 .dylib 文件)复制到扁平化的目录结构中。
自 Conan 2.20.0 起,将维护子目录并按原样保留。文件仅在通过 cpp_info.bindirs 和 cpp_info.libdirs 配置正确指定时,才包含在环境生成器中。
配置¶
当 conf tools.deployer:symlinks 设置为 False 时,full_deploy、direct_deploy 和 runtime_deploy 会理解以禁用 Deployers 复制符号链接。这在不支持符号链接的系统中可能很方便,并且如果部署包含符号链接的包可能会失败。
自定义 Deployers¶
可以使用 conan config install 管理自定义 Deployers。在查找特定 Deployer 时,Conan 将按以下顺序在这些位置查找 Deployer
绝对路径
相对于当前工作目录
在
[CONAN_HOME]/extensions/deployers文件夹中作为内置 Deployers
Conan 将查找要为每个已安装文件调用的 deploy() 方法。您的自定义 Deployers 的函数签名应如下所示
def deploy(graph, output_folder: str, **kwargs):
(请注意,参数作为命名参数传递,因此 graph 和 output_folder 名称都是必需的)
即使未使用,**kwargs 也是必需的,因为可以在未来的 Conan 版本中添加新的参数,而这些参数如果未定义 **kwargs 则会破坏这些参数。
您可以使用 graph.root.conanfile 访问您的 conanfile 对象。有关如何迭代其依赖项的信息,请参阅 ConanFile.dependencies。现在,您的自定义 Deployer 可以像内置 Deployer 一样使用它所在的文件的名称来调用,在这种情况下,conan install . --deployer=my_custom_deployer。请注意,提供 .py 扩展名是可选的。
请参阅 自定义 Deployers 部分,了解有关实现自己的 Deployers 的示例。