Conan 1.22:新的下载缓存、将 SCM 数据存储在 conandata.yml 中、Python 2 弃用、Python 3.8 支持等。
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 时更轻松的凭据处理
在使用 scm
和 auto
模式时,在调用 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"}
...
password
和 username
值存储在打包的 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 字典的所有内容,但 username
和 password
除外。如果您检查该文件,您将看到类似以下内容:
.conan:
scm:
revision: 3e5f02d6a557253sdas34fdee86b776cf70130c
type: git
url: https://github.com/somerepo/libA.git
如果您的配方有 conandata.yml,则在打包时这些字段将添加到您的文件中。
如您所见,现在 scm
字典被评估并存储在 conandata.yml 文件中,**除了** username
和 password
字段,以便您可以注入来自环境的凭据,但不会将这些凭据存储在包中。
使用符号名称进行导入
现在导入可以使用以 @ 开头的符号名称,例如 @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。
请查看 变更日志 中的功能和修复的完整列表。