Conan 1.21:更快的并行上传、Intel 编译器支持、改进的 Python 依赖项以及生成器中与上游包匹配的名称!
我们带着 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 Studio
或 gcc
包。
使用 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"]
,以便您可以为每个生成器指定此相同的名称。如果您想对同一个配方使用 CMake
和 pkg_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,这更直观。可用的日志级别为:
critical
、error
、warning
、info
和debug
。 - 使用
tools.check_min_cppstd()
和tools.valid_min_cppstd()
检查 cppstd 版本对于特定包是否有效。 - 在
tools.patch()
函数中使用fuzz
参数以接受模糊补丁。
查看 更改日志 中的功能和修复的完整列表。