部署器¶
部署器是一种机制,用于将文件从一个文件夹(通常是 Conan 缓存)复制到用户文件夹。虽然 Conan 提供了三个内置部署器(full_deploy、direct_deploy 和 runtime_deploy),但用户可以使用 conan config install 轻松管理自己的部署器。
部署器在生成器之前运行,并且可以更改目标文件夹。例如,如果 --deployer=full_deploy 部署器在 CMakeDeps 之前运行,那么由 CMakeDeps 生成的文件将指向 full_deploy 部署器在用户文件夹中完成的本地副本,而不是指向 Conan 缓存。可以通过提供多个 --deployer= 参数来指定多个部署器,它们将按出现顺序运行。
部署器可以是多配置的。对不同配置文件重复运行 conan install . --deployer=full_deploy 可以实现一个完全自包含的项目,包括所有工件、二进制文件和构建文件。该项目将完全独立于 Conan,并且不再需要它来构建。使用 --deployer-folder 参数可以根据需要更改部署器的基本输出文件夹路径。
内置部署器¶
警告
内置部署器处于 **预览** 状态。有关更多信息,请参阅 Conan 稳定性 部分。
full_deploy¶
将每个依赖项的每个包文件夹部署到您配方的 output_folder 中,其子文件夹树基于
构建上下文
依赖项名称和版本
构建类型
构建架构
然后每个依赖项将位于一个类似以下路径的文件夹中:
[OUTPUT_FOLDER]/full_deploy/host/dep/0.1/Release/x86_64
请参阅 为开发者创建 Conan 无关的依赖项部署 中关于 `full_deploy` 部署器用法的完整示例。
direct_deploy¶
与 `full_deploy` 相同,但仅处理您配方的 *直接* 依赖项。此部署器会将您的依赖项输出到类似以下路径的树状文件夹:
[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` 会禁用部署器复制符号链接。这在不支持符号链接的系统上可能很方便,并且在部署包含符号链接的包时可能会失败。
自定义部署器¶
自定义部署器可以通过 `conan config install` 进行管理。在查找特定部署器时,Conan 将按照以下顺序在这些位置查找部署器:
绝对路径
相对于当前工作目录
在 `[CONAN_HOME]/extensions/deployers` 文件夹中
作为内置部署器
Conan 将查找一个 `deploy()` 方法来为每个安装的文件调用。您的自定义部署器的函数签名应如下所示:
def deploy(graph, output_folder: str, **kwargs):
(请注意,参数是作为命名参数传递的,因此 `graph` 和 `output_folder` 名称都是必需的)
`**kwargs` 是必需的,即使未使用,因为 Conan 的未来版本可能会添加新参数,如果没有定义 `**kwargs`,这些参数会导致错误。
您可以使用 `graph.root.conanfile` 访问您的 conanfile 对象。有关如何迭代其依赖项的信息,请参阅 ConanFile.dependencies。现在可以使用文件名(在这种情况下是 `conan install . --deployer=my_custom_deployer`)调用您的自定义部署器,就像它是一个内置部署器一样。请注意,提供 `.py` 扩展名是可选的。
请参阅 自定义部署器 部分,了解有关如何实现自己的部署器的示例。