可编辑模式下的包

使用 Conan 包的正常方式是运行 conan createconan export-pkg 将它们存储在本地缓存中,以便使用者使用缓存中存储的包。在某些情况下,当您想在开发这些包时使用它们时,每次更改包时都运行 conan create 可能会很麻烦。对于这些情况,您可以将您的包置于可编辑模式,使用者将能够在您的本地工作目录中找到头文件和工件,从而无需打包。

让我们看看如何将一个包置于可编辑模式,并从本地工作目录中使用它。

请首先克隆源代码以重建此项目。您可以在 GitHub 的 examples2 存储库中找到它们

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/tutorial/developing_packages/editable_packages

此项目中有 2 个文件夹

.
├── 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()。阅读包布局() 部分以了解有关此方法的更多信息。

在本示例中,say conanfile.py 配方正在使用预定义的 cmake_layout(),它定义了典型的 CMake 项目布局,该布局可能因平台和使用的生成器而异。

现在 say/1.0 包处于可编辑模式,让我们在本地构建它

注意

我们在本示例中使用 CMake 预设。这需要 CMake >= 3.23,因为只有该版本才支持从 CMakeUserPresets.jsonCMakePresets.json 的“include”。如果您不想使用预设,可以使用类似以下的内容

cmake <path> -G <CMake generator> -DCMAKE_TOOLCHAIN_FILE=<path to
conan_toolchain.cmake> -DCMAKE_BUILD_TYPE=Release

如果您不能使用预设功能,Conan 将在每次运行 conan install 时显示确切的 CMake 命令。

$ cd say

# Windows: we will build 2 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 only build 1 configuration
$ conan install .
$ cmake --preset conan-release
$ cmake --build --preset conan-release

在可编辑模式下使用 say/1.0 包

从使用者的角度来看,使用处于可编辑模式的包是透明的。在这种情况下,我们可以像往常一样构建 hello 应用程序

$ cd ../hello

# Windows: we will build 2 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 1 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 2 configurations to show multi-config
$ cmake --build --preset conan-release
$ cmake --build --preset conan-debug

# Linux, MacOS: we will only build 1 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 文件夹在可编辑模式下构建和测试一个包。如果将一个包置于 editable 模式,并且它包含一个 test_package 文件夹,则 conan create 命令仍将对当前包进行本地构建。

还原可编辑模式

为了还原可编辑模式,只需使用以下命令删除链接

$ conan editable remove --refs=say/1.0

它将删除链接(本地目录不会受到影响),并且所有使用此要求的包将再次从缓存中获取它。

警告

在它们的上游使用可编辑包构建的包可能会生成与可编辑包的已发布版本不兼容的二进制文件和包。避免在不使用所有库的缓存版本重新创建这些包的情况下上传它们。