为开发者使用创建与 Conan 无关的依赖项部署

通过 full_deploy 部署器,可以创建依赖项的独立于 Conan 的副本,开发者无需在计算机上安装 Conan 即可使用。

大多数情况下的通用且推荐的流程是直接使用 Conan 缓存中的 Conan 包

../../../../_images/packages_from_cache.png

但是,在某些情况下,将依赖项的副本部署到用户文件夹可能会很有用,这样依赖项就可以位于该文件夹中,而不是位于 Conan 缓存中。这可以通过使用 Conan 部署器来实现。

让我们通过一个例子来了解。所有源代码都在 examples2.0 Github 仓库

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/extensions/deployers/development_deploy

在该文件夹中,我们可以找到以下 conanfile.txt

[requires]
zlib/1.2.13

[tool_requires]
cmake/3.25.3

[generators]
CMakeDeps
CMakeToolchain

[layout]
cmake_layout

该文件夹还包含一个标准的 CMakeLists.txt 和一个 main.cpp 源文件,它们可以创建一个链接到 zlib 库的可执行文件。

我们可以安装 Debug 和 Release 依赖项,并使用以下命令部署包的本地副本:

$ conan install . --deployer=full_deploy --build=missing
$ conan install . --deployer=full_deploy -s build_type=Debug --build=missing

这将创建以下文件夹:

├──src
├──build
│   ├──generators
|         └── ZLibConfig.cmake
├──full_deploy
│   ├──build
│   │   └──cmake
│   │       └──3.25.3
│   │           └──x86_64
│   │               ├──bin
│   │
│   └──host
│       └──zlib
│           └──1.2.13
│               ├──Debug
│               │   └──x86_64
│               │       ├──include
│               │       ├──lib
│               └──Release
│                   └──x86_64
│                       ├──include
│                       ├──lib

(请注意,您可以使用 --deployer-folder 参数来更改部署器的基础文件夹输出路径)

该文件夹是完全独立的。它包含必要的工具(如 cmake 可执行文件)、zlib 的头文件和编译后的库,以及 build/generators 文件夹中的 ZLibConfig.cmake 等必要文件,这些文件通过相对路径指向 full_deploy 中的二进制文件。

../../../../_images/independent_dependencies_deploy.png

可以删除 Conan 缓存,甚至卸载 Conan,然后将该文件夹移动到计算机上的其他位置或复制到另一台计算机,前提是它具有相同的 OS、编译器等配置。

$ cd ..
$ cp -R development_deploy /some/other/place
$ cd /some/other/place

开发者可以像这样使用这些文件:

Windows
$ cd build
# Activate the environment to use CMake 3.25
$ generators\conanbuild.bat
$ cmake --version
cmake version 3.25.3
# Configure, should match the settings used at install
$ cmake .. -G \"Visual Studio 17 2022\" -DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake
$ cmake --build . --config Release
$ Release\compressor.exe
ZLIB VERSION: 1.2.13

Linux 和 OSX 中的环境脚本是不可迁移的,因为它们包含绝对路径,并且 sh shell 无法为源文件提供对当前脚本目录的访问权限

这不应该是一个很大的障碍,因为在生成器文件夹中使用 sed 进行“查找和替换”可以解决此问题

Linux
$ cd build/Release/generators
# Fix folders in Linux
$ sed -i 's,{old_folder},{new_folder},g' *
# Fix folders in MacOS
$ sed -i '' 's,{old_folder},{new_folder},g' *
$ source conanbuild.sh
$ cd ..
$ cmake --version
cmake version 3.25.3
$ cmake ../.. -DCMAKE_TOOLCHAIN_FILE=generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
$ ./compressor
ZLIB VERSION: 1.2.13

注意

最佳实践

虽然可以实现这种流程,但并不意味着它在大多数情况下都是推荐的。它有一些限制:

  • 效率较低,需要额外复制一份依赖项

  • 目前只有 CMakeDepsCMakeToolchain 是可迁移的。对于其他构建系统集成,请在 Github 上创建一个工单。

  • Linux 和 OSX shell 脚本不可迁移,需要手动使用 sed

  • 二进制可变性仅限于 Release/Debug。生成的文件仅适用于当前配置,更改任何其他设置(os、compiler、architecture)都需要不同的部署。

在一般情况下,建议正常使用缓存。这种“可迁移开发部署”可能有助于分发看起来像 SDK 的最终产品,供不使用 Conan 的项目用户使用。