可编辑模式下的软件包¶
与 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() 部分 以了解有关此方法的更多信息。
在此示例中,“say” conanfile.py 配方使用了预定义的 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 presets。这需要 CMake >= 3.23,因为 CMakeUserPresets.json 到 CMakePresets.json 的“include”功能自该版本起才受支持。如果您不想使用 presets,可以使用类似以下的方式:
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 配方中的 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
它将删除链接(本地目录不受影响),并且所有使用此需求的软件包将再次从缓存中获取它。
警告
在消耗可编辑软件包时构建的软件包,可能会生成与可编辑软件包已发布版本不兼容的二进制文件和软件包。避免在未通过所有库的缓存版本重新创建这些软件包的情况下上传它们。