2020年伊始,Conan 1.22 就带来了许多新功能和错误修复。

另外,别忘了距离 ConanDays 仅剩 6 周时间。在这个活动中,社区将参与定义 Conan 的未来以及从版本 1 到 **Conan 2.0** 的过渡。请尽快 获取门票,名额有限。

现在,让我们来看看 Conan 1.22 版本中最重要的内容。

新的下载缓存

随着每个新的 Conan 版本发布,我们都在努力逐步加快 CI 的速度。上一个版本是 Conan 1.21,我们在其中引入了 并行上传,可以 **将速度提高约 400%**。

现在,我们发布了一个新的下载缓存,可以使用不同的 CONAN_USER_HOME 文件夹由多个 Conan 实例并发使用。此缓存可以在不同的并发 CI 作业之间共享,因此,如果文件之前已下载,则将从缓存中重用,而无需再次下载。

要测试此功能,您必须在 conan.conf 文件中设置相应的配置。

$ conan config set storage.download_cache="/path/to/my/cache"

您可以通过随后更改 CONAN_USER_HOME 来测试该功能的性能改进,用于安装大型包的不同 Conan 调用,但为所有这些调用设置相同的下载缓存。

$ export CONAN_USER_HOME=/Users/yourusername/conan_home_1/
$ conan config set storage.download_cache="/Users/yourusername/central_cache"
$ time conan install boost/1.72.0@
...
boost/1.72.0: LIBRARIES: ['boost_wave', 'boost_container', 'boost_contract', ...
boost/1.72.0: Package folder: /Users/yourusername/conan_home_1/.conan/data/boost/1.72.0/_/_/package/69168f775732984eb37d785004b6ef25111fe5f9
conan install boost/1.72.0@  4.70s user 3.87s system 36% cpu 23.428 total
...
$ export CONAN_USER_HOME=/Users/yourusername/conan_home_2/
$ conan config set storage.download_cache="/Users/yourusername/central_cache"
$ time conan install boost/1.72.0@
...
boost/1.72.0: LIBRARIES: ['boost_wave', 'boost_container', 'boost_contract', ...
boost/1.72.0: Package folder: /Users/yourusername/conan_home_2/.conan/data/boost/1.72.0/_/_/package/69168f775732984eb37d785004b6ef25111fe5f9
conan install boost/1.72.0@  4.03s user 3.38s system 51% cpu 14.491 total
...

如您在命令行输出中看到的,第一次,在缓存为空的情况下,下载需要 **23.428 秒**,这与如果没有缓存的情况下下载所需的时间相同。在设置第二个 CONAN_USER_HOME 并将下载缓存指向同一文件夹后,下载时间为 **14.491 秒**,这几乎是未使用下载缓存所需时间的一半。

如果要停用缓存,请勿忘记执行以下操作:

$ conan config rm storage.download_cache

然后删除缓存文件夹的内容或文件夹本身。此外,如果您更改了 CONAN_USER_HOME,请将其恢复为原始值。

使用 SCM 时更轻松的凭据处理

在使用 scmauto 模式时,在调用 conan create 后,将评估 scm 字典中的信息并将其写入存储在包中的 conanfile.py。当您想要从环境中获取凭据时,这可能会出现问题,因为您尝试获取的环境变量也将被评估并存储在打包的 conanfile.py 中。让我们看一个例子:

...
class LibA(ConanFile):
    ...
    scm = {"type": "git",
           "url": "auto",
           "revision": "auto",
           # imagine that this environment variable exists 
           # and its value is "this_is_my_secret_password"
           "password": os.environ.get("MYPASS", None),
           # MYUSER is my_user
           "username": os.environ.get("MYUSER", None)} 
    ...

现在,如果您对该配方执行 conan create . 并转到本地缓存中的包文件夹,您将看到存储在那里的 conanfile.py 类似于以下内容:

...
class LibA(ConanFile):
    ...
    scm = {"password": "this_is_my_secret_password",
           "username": "my_user",
           "revision": "3e5f02d6a557253sdas34fdee86b776cf70130c",
           "type": "git",
           "url": "https://github.com/somerepo/libA.git"}
    ...

passwordusername 值存储在打包的 conanfile.py 文件中。

现在,从 Conan 1.22 开始,可以使用 conan.conf 文件中的 scm_to_conandata 配置值来避免此问题。

conan config set general.scm_to_conandata=True

启用 scm_to_conandata 后,创建包后,如果您检查本地缓存导出文件夹,您将看到原始的 conanfile.py 未修改,并且在 conanfile.py 文件旁边有一个 conandata.yml 文件,其中包含 scm 字典的所有内容,但 usernamepassword 除外。如果您检查该文件,您将看到类似以下内容:

.conan:
  scm:
    revision: 3e5f02d6a557253sdas34fdee86b776cf70130c
    type: git
    url: https://github.com/somerepo/libA.git

如果您的配方有 conandata.yml,则在打包时这些字段将添加到您的文件中。

如您所见,现在 scm 字典被评估并存储在 conandata.yml 文件中,**除了** usernamepassword 字段,以便您可以注入来自环境的凭据,但不会将这些凭据存储在包中。

使用符号名称进行导入

现在导入可以使用以 @ 开头的符号名称,例如 @bindirs@libdirs 等。如果您有可变的包布局,这将非常有用。例如,如果您在 package_info() 中定义了一个自定义布局:

    def package_info(self):
        ...
        self.cpp_info.bindirs.append("mybin")
        ...

该文件夹中的文件可以使用符号名称 @bindirs 从使用者包中导入。

def imports(self):
    ...
    self.copy("*", src="@bindirs", dst="bin")
    ...

如果您在可编辑模式下使用包并且定义了 [bindirs],则也可以使用此功能。

使用 MSBuild 构建助手添加额外的用户定义属性

使用新的 user_property_file_name 参数,您可以将包含用户属性的文件名列表传递给 build 方法,该方法将优先于 conan_build.props 文件(来自这些用户定义属性文件的值可以覆盖 conan_build.props 中的值)。

Python 2 弃用和 Python 3.8 支持

1月1日,Python 维护人员 弃用了 Python 2,因此 Conan 从 1.22 版本开始将不再支持 Python 2。

如果您仍在使用 Python 2,请尽快更新。

还需要说明的是,从 Conan 1.22 开始,支持 Python 3.8。




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

如有任何错误或反馈,请在我们的 问题跟踪器 中打开一个新问题,并不要忘记 更新