可编辑模式下的包¶
使用 Conan 包的常规方法是运行 conan create
或 conan export-pkg
将它们存储在本地缓存中,以便消费者使用缓存中存储的包。 在某些情况下,当你想在使用这些包的同时进行开发时,每次对包进行更改都运行 conan create
可能会很麻烦。 对于这些情况,你可以将你的包置于可编辑模式,消费者将能够在你的本地工作目录中找到头文件和构件,从而无需打包。
让我们看看如何将一个包置于可编辑模式并从本地工作目录中使用它。
请首先克隆源码以重新创建此项目。 你可以在 GitHub 上的 examples2 仓库中找到它们
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/tutorial/developing_packages/editable_packages
此项目中有两个文件夹
.
├── hello
│ ├── CMakeLists.txt
│ ├── conanfile.py
│ └── src
│ └── hello.cpp
└── say
├── CMakeLists.txt
├── conanfile.py
├── include
│ └── say.h
└── src
└── say.cpp
一个 “say” 文件夹,包含一个完整的包,带有它的
conanfile.py
及其源代码。一个 “hello” 文件夹,包含一个简单的消费者项目,带有它的
conanfile.py
及其源代码,它依赖于say/1.0
需求。
我们将把 say/1.0
置于可编辑模式,并展示 hello
消费者如何在它的本地工作目录中找到 say/1.0
的头文件和二进制文件。
将 say/1.0 包置于可编辑模式¶
为了避免每次更改都在缓存中创建 say/1.0
包,我们将把该包置于可编辑模式,从而**在缓存中的引用和本地工作目录之间创建一个链接**
$ conan editable add say
$ conan editable list
say/1.0
Path: /Users/.../examples2/tutorial/developing_packages/editable_packages/say/conanfile.py
从现在开始,任何其他 Conan 包或项目对 say/1.0
的每次使用都将被重定向到 /Users/.../examples2/tutorial/developing_packages/editable_packages/say/conanfile.py
用户文件夹,而不是使用 Conan 缓存中的包。
请注意,可编辑包的关键在于正确定义包的 layout()
。 阅读 package layout() section 以了解有关此方法的更多信息。
在本例中,say
conanfile.py
recipe 正在使用预定义的 cmake_layout()
,它定义了典型的 CMake 项目布局,该布局可能因平台和所使用的生成器而异。
现在 say/1.0
包处于可编辑模式,让我们在本地构建它
$ cd say
# Windows: we will build two configurations to show multi-config
$ conan install . -s build_type=Release
$ conan install . -s build_type=Debug
$ cmake --preset conan-default
$ cmake --build --preset conan-release
$ cmake --build --preset conan-debug
# Linux, macOS: we will build only one configuration
$ conan install .
$ cmake --preset conan-release
$ cmake --build --preset conan-release
注意
本例中我们使用 CMake 预设。 这需要 CMake >= 3.23,因为只有从该版本才支持从 CMakeUserPresets.json
“include” 到 CMakePresets.json
。 如果你不想使用预设,你可以使用类似的东西
cmake <path> -G <CMake generator> -DCMAKE_TOOLCHAIN_FILE=<path to
conan_toolchain.cmake> -DCMAKE_BUILD_TYPE=Release
如果你无法使用预设功能,Conan 将在每次运行 conan install
时显示确切的 CMake 命令。
使用可编辑模式下的 say/1.0 包¶
从消费者角度来看,使用可编辑模式下的包是透明的。 在本例中,我们可以像往常一样构建 hello
应用程序
$ cd ../hello
# Windows: we will build two configurations to show multi-config
$ conan install . -s build_type=Release
$ conan install . -s build_type=Debug
$ cmake --preset conan-default
$ cmake --build --preset conan-release
$ cmake --build --preset conan-debug
$ build\Release\hello.exe
say/1.0: Hello World Release!
...
$ build\Debug\hello.exe
say/1.0: Hello World Debug!
...
# Linux, macOS: we will only build one configuration
$ conan install .
$ cmake --preset conan-release
$ cmake --build --preset conan-release
$ ./build/Release/hello
say/1.0: Hello World Release!
如你所见,hello
可以成功找到 say/1.0
包的头文件和库文件。
使用可编辑的包¶
完成上述步骤后,你可以在不涉及 Conan 的情况下使用你的构建系统或 IDE,并对可编辑的包进行更改。 任何更改都将直接应用于消费者。 让我们通过更改 say
源代码来看看它是如何工作的
$ cd ../say
# Edit src/say.cpp and change the error message from "Hello" to "Bye"
# Windows: we will build two configurations to show multi-config
$ cmake --build --preset conan-release
$ cmake --build --preset conan-debug
# Linux, macOS: we will only build one configuration
$ cmake --build --preset conan-release
并构建和运行 “hello” 项目
$ cd ../hello
# Windows
$ cd build
$ cmake --build --preset conan-release
$ cmake --build --preset conan-debug
$ Release\hello.exe
say/1.0: Bye World Release!
$ Debug\hello.exe
say/1.0: Bye World Debug!
# Linux, macOS
$ cmake --build --preset conan-release
$ ./hello
say/1.0: Bye World Release!
这样,你可以同时开发 say
库和 hello
应用程序,而无需在它们之间执行任何 Conan 命令。 如果你已经在 IDE 中同时打开它们,你可以简单地一个接一个地构建它们。
构建可编辑的依赖项¶
如果有许多可编辑的依赖项,则逐个构建它们可能不方便。 可以使用 --build
参数对可编辑的依赖项进行有序构建。
让我们首先清除之前的本地可执行文件
$ git clean -xdf
使用 hello/conanfile.py
recipe 中的 build()
方法,我们目前还没有真正使用它(因为我们一直在直接调用 cmake
进行构建,而不是通过调用 conan build
命令),我们可以只用
$ conan build hello
请注意,要执行此项目的完整构建,我们所要做的就是这两个命令。 从头开始在一个不同的文件夹中
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/tutorial/developing_packages/editable_packages
$ conan editable add say
$ conan build hello --build=editable
请注意,如果我们没有将 --build=editable
传递给 conan build hello
,则 say/0.1
(处于可编辑模式)的二进制文件将不可用,并且会失败。 使用 --build=editable
,首先会在本地增量构建 say
二进制文件,然后再对 hello
进行另一个增量构建。 一切都将仍然发生在本地,而不会在缓存中构建任何包。 如果有多个 editable
依赖项,以及嵌套的传递依赖项,Conan 将以正确的顺序构建它们。
如果可编辑包在 Conan 缓存中具有依赖项,则可以通过使用 --build=editable --build=cascade
强制从源代码重建缓存依赖项。 然而,通常应避免这种情况。 如果需要重建这些依赖项,建议也将它们置于可编辑模式。
请注意,可以使用它自己的 test_package
文件夹在可编辑模式下构建和测试包。 如果一个包被置于可编辑模式,并且如果它包含一个 test_package
文件夹,则 conan create 命令仍将对当前包进行本地构建。
恢复可编辑模式¶
为了禁用包的可编辑模式,只需使用以下命令删除链接
$ conan editable remove --refs=say/1.0
它将删除链接(本地目录不会受到影响),并且所有使用此需求的包将再次从缓存中获取它。
警告
在构建上游可编辑包时构建的包可能会生成与可编辑包的已发布版本不兼容的二进制文件和包。 在不使用所有库的缓存版本重新创建这些包的情况下,请避免上传它们。