最新的 Conan 1.14 版本包含了许多修复和小的改进。以下是概述!

为您的配方选择修订模式

在之前的 1.14 版本中,我们引入了**修订版本**,作为在不更改实际引用版本的情况下隐式版本化配方更改的方式。这现在作为 Conan 模型的一部分实现,这意味着远程中存在的最新修订版本是自动安装的版本(除非另有说明)。

请查看文档中的修订版本部分以了解更多信息。

修订版本功能是实现可重复性的关键步骤之一,这意味着修订版本被计算为一个唯一的 ID,称为“配方修订版本”和“包修订版本”。

此版本引入的新功能是能够为每个配方选择修订模式。您可以使用配方的内容哈希(默认)作为配方修订版本,或者使用检测到的 SCM 的提交:gitSVN

from conans import ConanFile


class MyRecipe(ConanFile):
    name = "library"
    version = "1.0.3"
    revision_mode = "scm"

请注意,某些 CVS 系统(如 Git)对整个存储库都有唯一的提交。因此,如果您在同一个存储库中有多个配方,您可能不希望仅在一个配方中提交更改时就创建新的配方修订版本,而是仅为修改的配方创建新的修订版本。在这种情况下,您应该使用默认模式 revision_mode = "hash"。修订版本将是配方内容的哈希值(注意不同系统之间的换行符)。

Artifactory 现在支持修订版本!

在 Conan 发布之前,新的Artifactory 6.9 版本提供了对修订版本的完全支持。

所有新的 Artifactory 版本默认都会使用修订版本。这意味着包将以新的布局存储在 Conan 存储库中:<user>/<name>/<version>/<channel>/<recipe_revision>/<package_id>/package_revision>

Conan 客户端 < 1.13 仍然可以工作,并且会在存储库中创建 0 的配方和包修订版本以保持兼容性。

请记住,修订版本功能是客户端的可选功能,您需要在配置中使用 conan config set general.revisions_enabled=True 或设置环境变量 CONAN_REVISIONS_ENABLED=1 来激活它。

您可以使用Artifactory 社区版 for C++开始使用修订版本。

新的 cmake_find_package_multi 生成器

继续列出用于实现透明集成的新的 CMake 生成器,我们引入了 cmake_find_package_multi 生成器来实现 Release/Debug 模式下包的多配置。

让我们尝试使用此新生成器进行入门示例

$ git clone git@github.com:conan-io/examples.git
$ cd examples/libraries/poco/md5
$ ls
CMakeLists.txt  README.md  build.bat  build.sh*  conanfile.txt  md5.cpp

CMakeLists.txt 文件将更改为以下内容

cmake_minimum_required(VERSION 3.0)
project(MD5Encrypter)

set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR})
set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR})

find_package(Poco)

add_executable(md5 md5.cpp)
target_link_libraries(md5 Poco::Poco)

并且让我们在 conanfile.txt 中也使用新的 cmake_find_package_multi

[requires]
Poco/1.9.0@pocoproject/stable

[generators]
cmake_find_package_multi

现在我们可以安装 Release 和 Debug 包,并像往常一样使用 CMake 构建

$ mkdir build && cd build
$ conan install .. -s build_type=Debug
$ conan install .. -s build_type=Release

$ cmake .. -G "Visual Studio 15 2017 Win32"

$ cmake --build . --config Debug
.\Debug\md5.exe
c3fcd3d76192e4007dfb496cca67e13b

$ cmake --build . --config Release
.\Release\md5.exe
c3fcd3d76192e4007dfb496cca67e13b

cmake_find_package_multi 文档中了解更多信息。

将 Conan 配置安装到文件夹

我们正在努力改进 conan config install 的功能,以便您可以混合来自不同来源的配置文件。现在,您可以选择获取文件的源文件夹和要安装文件的目标文件夹。

$ conan config install http://url/to/some/config.zip -sf=origin -tf=target
$ conan config install http://url/to/some/config.zip -sf=origin2 -tf=target2
$ conan config install http://other/url/to/other.zip -sf=hooks -tf=hooks

操作将被缓存,因此您可以执行 conan config install,并且先前的操作将按顺序执行。

这将有助于从不同位置设置钩子,例如,测试官方钩子,如下所示

$ conan config install git@github.com:conan-io/hooks.git --source-folder hooks --target-folder hooks/conan-io

这也可以用于从存储库或 zip 文件安装特定的配置文件或远程。

conan config 命令文档中了解更多信息。

安装包并重新构建引用

命令 conan install . --build 现在接受完整引用作为参数。您可以使用它来重新构建依赖关系图中的特定引用

$ conan install Poco/1.9.0@pocoproject/stable --build zlib/1.2.11@conan/stable

这对于在依赖关系图中单独构建依赖关系很有用,例如名称可能重复但版本、用户或通道不同的私有需求。

您也可以对完整引用使用通配符

$ conan install Poco/1.9.0@pocoproject/stable --build z*@conan/stable

conan install 命令文档中了解更多信息。

依赖项覆盖错误

覆盖需求时,您可能希望显式地依赖于该依赖项,而不是进行覆盖。

例如,在 conanfile.txt 中执行以下操作

[requires]
Poco/1.9.0@pocoproject/stable
OpenSSL/1.0.2r@conan/stable

第二行将使用 OpenSSL/1.0.2r@conan/stable **覆盖** Poco 所需的 OpenSSL/1.0.2o@conan/stable,**并**将需求添加到使用者项目中。

$ conan install .
...
WARN: Poco/1.9.0@pocoproject/stable requirement OpenSSL/1.0.2o@conan/stable overridden by your conanfile to OpenSSL/1.0.2r@conan/stable

如上所示,输出默认情况下会警告此行为。但是,如果您希望 Conan 在出现此行为时出错,则可以设置新的环境变量或 conan.conf 中的配置条目以避免未被注意的覆盖

  • 环境变量:CONAN_ERROR_ON_OVERRIDE=1
  • 配置条目:error_on_override = True
$ conan config set general.error_on_override=True

$ conan install .
...
ERROR: Poco/1.9.0@pocoproject/stable: requirement OpenSSL/1.0.2o@conan/stable overridden by your conanfile to OpenSSL/1.0.2r@conan/stable

目前,无法声明一个需求并使用 override 关键字添加它以避免为该特定依赖项引发错误。Conan 将引发一个错误,指出它重复了。有一个关于此问题的未解决的问题

CA 证书配置

在企业组织中,通常需要使用自定义 CA 证书来执行每个 HTTP 请求。但是,如果您想通过 conan config install 安装 Conan 配置,则无法指定要使用的证书。您可以使用 --verify-ssl=False 覆盖此检查,但这并不是最合适的解决方案。

我们引入了一个环境变量和配置条目来指向要使用的证书文件

  • 环境变量:CONAN_CACERT_PATH=~/cacert.pem
  • 配置条目:cacert_path = ~/cacert.pem


变更日志中查看完整的功能和修复列表,并且不要忘记更新

最后,如果您发现错误或想开始新的讨论,请随时在此处打开新的问题。非常感谢!