为开发者创建与 Conan 无关的依赖项部署¶
使用 full_deploy
部署器,可以创建一个与 Conan 无关的依赖项副本,即使开发者的计算机上没有安装 Conan 也可以使用。
对于大多数情况,常见且推荐的流程是直接从 Conan 缓存中使用 Conan 包
然而,在某些情况下,将依赖项的副本部署到用户文件夹可能很有用,这样依赖项就可以放在那里,而不是在 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
的头文件和编译库,以及必要的 ZLibConfig.cmake
等文件,这些文件位于 build/generators
文件夹中,并使用相对路径指向 full_deploy
内的二进制文件。
可以删除 Conan 缓存,甚至卸载 Conan,然后可以将该文件夹移动到计算机上的其他位置或复制到另一台计算机,前提是它具有相同的操作系统、编译器等配置。
$ cd ..
$ cp -R development_deploy /some/other/place
$ cd /some/other/place
开发人员可以按如下方式使用这些文件:
$ 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 无法为源文件提供对当前脚本目录的访问。
这不应该是一个大的阻碍,因为在 generators 文件夹中使用 sed
进行 “查找和替换” 即可修复它
$ 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
注意
最佳实践
虽然这种流程是可行的,但这并不意味着在大多数情况下都推荐使用它。它有一些局限性
效率较低,需要额外的依赖项副本
目前只有
CMakeDeps
和CMakeToolchain
是可重定位的。对于其他构建系统集成,请在 Github 中创建一个工单Linux 和 OSX shell 脚本是不可重定位的,需要手动使用
sed
二进制文件的可变性仅限于 Release/Debug。生成的文件专门用于当前配置,更改任何其他设置(操作系统、编译器、体系结构)将需要不同的部署
在一般情况下,建议正常使用缓存。这种 “可重定位的开发部署” 对于向不使用 Conan 的项目消费者分发看起来像 SDK 的最终产品可能很有用。