我们带着 1.21 版本告别 2019 年,这个版本包含了许多很酷的功能、错误修复以及来自社区的贡献。让我们看看其中的一些。

使用多线程将 Conan 包上传到远程仓库

在许多用户请求此功能后,我们从 Conan 1.19 开始准备它。首先,我们迁移到一个支持并发的进度条系统。之后,我们对控制台输出进行了全面重构。现在,从 Conan 1.21 开始,由于使用了多线程,可以更快地将 Conan 包上传到远程仓库。要激活此功能,只需在 conan upload 命令中添加 --parallel 参数。

$ conan upload "*" --confirm --parallel --all -r my_remote

有两个级别的并行化。首先,所有引用都并行上传。然后,对于每个引用,其所有二进制包也并行上传。用于上传的总并发线程的最大级别为 8。根据配置和上传包的数量,可以实现大约 400% 的速度提升

Intel 编译器支持

现在 Conan 支持 Intel 编译器。此编译器具有在 Windows 中使用 Visual Studio 以及在 Linux 中使用 gcc 作为基础编译器的特性。以下是 *settings.yml* 中的新条目。

intel:
    version: ["11", "12", "13", "14", "15", "16", "17", "18", "19"]
    base:
        gcc:
            <<: *gcc
            threads: [None]
            exception: [None]
        Visual Studio:
            <<: *visual_studio

要管理使用 intel 生成的包与使用基础编译器生成的包之间的兼容性,可以使用 compatible_packages 功能,该功能提供 base_compatible()parent_compatible(compiler="compiler", version="version") 函数来定义包之间的兼容性。

例如,以这种方式定义一个 package_id

def package_id(self):

    if self.settings.compiler == "intel":
        p = self.info.clone()
        p.base_compatible()
        self.compatible_packages.append(p)

将使 Conan 在没有使用 intel 编译器生成的包的情况下解析 Visual Studiogcc 包。

使用 parent_compatible 函数也可以实现相反的功能,即在不存在 Visual Studio 包的情况下回退到 Intel 包。

def package_id(self):

   if self.settings.compiler == "Visual Studio":
      compatible_pkg = self.info.clone()
      compatible_pkg.parent_compatible(compiler="intel", version=16)
      self.compatible_packages.append(compatible_pkg)

改进的 Python 依赖项

在 1.7 版本中,我们引入了 Python 依赖项功能,以便在不同的配方之间共享 Python 代码。对于此版本,我们有一个新的改进的 python_requires,它解决了旧版本的一些缺点。以下是新实现的主要功能

  • 类属性。语法声明一个类属性,而不是模块函数调用,因此配方更简洁。

  • PackageID 修改。现在 python_requires 将影响使用者包的 package_id。

正如我们所说,现在语法更简单,并且与配方的其余语法更一致。使用旧版本,如果您想重用基类中的方法,则必须执行以下操作

from conans import ConanFile, python_requires

base = python_requires("pyreq/version")

class ConsumerConan(base.get_conanfile()):
    name = "consumer"
    version = base.get_version()

使用新语法,它看起来像这样

from conans import ConanFile

class Pkg(ConanFile):
    python_requires = "pyreq/version"
    python_requires_extend = "pyreq.MyBase"

现在,python_requires 的版本将使用 minor_mode 策略影响使用它们的包的 Package ID。这意味着,如果您更改版本的小版本或主版本组件,它将生成一个新的 Package ID,但修补程序组件不会影响 ID。在 Conan 文档 中了解有关新实现的更多信息。

按生成器使用不同的名称

您可能知道,conanfile 中的 cpp_info 属性存储了包的使用者所需的所有信息,例如包含目录或库名称和路径。从 1.19 开始,我们为该对象引入了一个名为 name 的新属性,因此如果您设置 cpp_info.name,则某些受支持的生成器应使用该名称创建文件或变量名称,而不是使用常规的包名称。

现在,在 1.21 版本中,我们扩展了此功能,方法是使用 cpp_info.names["generator_name"],以便您可以为每个生成器指定此相同的名称。如果您想对同一个配方使用 CMakepkg_config 生成器,则可以为每个生成器设置不同的名称。

让我们来看一个示例,其中您有一个 conanfile.py,其中包含此 package_info 用于包 Mylib/0.1

    def package_info(self):
        self.cpp_info.names["cmake"] = "MyLib"
        self.cpp_info.names["pkg_config"] = "my_lib"

如果使用 CMake 生成器安装此包,则将创建名为 CONAN_PKG::MyLib 的目标。如果您使用 pkg_config 生成器安装包,则将生成一个名为 my_lib.pc 的文件,其中包含一个名为 my_lib 的库名称。

其他很酷的功能

  • 使用名称而不是数字将 日志级别 设置为 Conan,这更直观。可用的日志级别为:criticalerrorwarninginfodebug
  • 使用 tools.check_min_cppstd()tools.valid_min_cppstd() 检查 cppstd 版本对于特定包是否有效。
  • tools.patch() 函数中使用 fuzz 参数以接受模糊补丁。




查看 更改日志 中的功能和修复的完整列表。

报告任何错误或分享您的反馈,在我们的 问题跟踪器 中打开一个新问题,不要忘记 更新圣诞快乐!