随着 Conan 2 的不断发展,我们很高兴宣布最近发布了 Conan 2.0.14。此更新引入了旨在提高生产环境中效率和生产力的新功能。在这篇文章中,我们将重点介绍两个最近的添加:缓存保存/恢复和 LRU(最近最少使用)清理。

从缓存中保存和恢复包

此功能旨在用于临时包移动,提供了一种在不同 Conan 缓存之间传输包的有效方法。它非常适合以下场景

  • CI 管道:它有助于在不同作业之间共享中间构建阶段或依赖项。对于并行作业特别有用,因为 Conan 缓存不是并发的。

  • 隔离环境:在无法直接访问互联网且必须通过客户端传输包的情况下有用。

需要注意的是,保存和恢复包是一种短期机制,不适用于长期存储或作为备份策略。存储格式和序列化虽然在同一 Conan 版本内有效,但可能在将来的 Conan 版本中不稳定或不兼容。对于 Conan 包的长期备份,建议使用服务器端备份策略。

工作原理

例如,假设我们在 CI 中为三个不同的平台构建应用程序。我们 CI 中的主要作业将在不同的代理上触发三个不同的构建。

Conan cache save/restore

在每次构建之后,您可以使用 conan cache save 命令将缓存中选定的包保存到每个平台的 tgz 文件中。作为命令的参数,您可以传递一个引用模式(如 conan list 命令中所用)或一个 package-list json 文件。让我们保存 Conan 缓存中所有包的最新版本

# save the last revision of all packages in the cache
$ conan cache save "*/*:*" --file=conan_cache_save_linux.tgz
Saving app/2.71: p/autoc5f0e65aa481c3
Saving app/2.71:da39a3ee5e6b4b0d3255bfef95601890afd80709: p/autocf3e6879dde7f6/p
Saving bzip2/1.0.8: p/bzip2b261b4dea28b4
Saving bzip2/1.0.8:e3dc948df7773c2c60edf3a72557250108721b20: p/bzip23cfe2c0da64ba/p
Saving cmake/3.27.7: p/cmake9a3eb5e13dc53
Saving cpp-httplib/0.11.3: p/cpp-hd3892a337ccc3
Saving eigen/3.4.0: p/eigenecaf3dc594b0c
...
# creates conan_cache_save_linux.tgz

保存的 .tgz 文件包含配方文件夹、包元数据和其他必要内容,不包括“build”或“download”等临时文件夹。您可以为每个并行作业保存包,并在每个作业结束时将它们存储起来,以便稍后在主作业中恢复,在主作业中您可以使用 conan cache restore 命令恢复所有保存的包到 Conan 缓存中

$ conan cache restore conan_cache_save.tgz 
Restore: app/2.71 in p/autoc5f0e65aa481c3
Restore: app/2.71:da39a3ee5e6b4b0d3255bfef95601890afd80709 in p/autocf3e6879dde7f6/p
Restore: bzip2/1.0.8 in p/bzip2b261b4dea28b4
Restore: bzip2/1.0.8:e3dc948df7773c2c60edf3a72557250108721b20 in p/bzip23cfe2c0da64ba/p
Restore: cmake/3.27.7 in p/cmake9a3eb5e13dc53
Restore: cpp-httplib/0.11.3 in p/cpp-hd3892a337ccc3
Restore: eigen/3.4.0 in p/eigenecaf3dc594b0c
...

有关如何使用此功能的更多详细信息,请参阅 Conan 文档

LRU:从缓存中删除未使用的包

Conan 现在支持 LRU(最近最少使用)策略,以有效地管理缓存大小。此功能对于维护优化后的包缓存非常重要,因为 Conan 缓存未实现任何自动过期策略,因此除非删除包或定期清除缓存,否则其大小将始终增加。

工作原理

LRU 功能的使用是通过 conan removeconan list 命令的 --lru 参数实现的。您可以使用它来删除旧的包二进制文件或删除配方及其关联的二进制文件。LRU 时间遵循 remove 命令的规则。如果我们使用“*”模式删除配方,则只会检查配方的 LRU 时间。如果配方最近被使用过,它将保留所有二进制文件;如果配方没有被最近使用过,它将删除自身及其所有二进制文件。

例如,如果我们要删除过去 2 个月内未使用的所有二进制文件(但不删除配方),我们可以执行以下操作

$ conan remove "*:*" --lru=2M -c

要删除所有配方(及其关联的二进制文件)

$ conan remove "*" --lru=2M -c

您也可以使用 conan list 命令使用 LRU 参数生成最近最少使用包的列表,然后将生成的包列表传递给 conan remove 命令。对于删除过去两个月内未使用的所有配方和包的等效方法,可以执行以下操作

# List all unused (last 2 months) recipe revisions
$ conan list "*#*" --lru=2M --format=json > old.json
# Remove those recipe revisions (and their binaries)
$ conan remove --list=old.json -c

总结

Conan 中添加缓存保存/恢复和 LRU 清理功能显著提高了效率,尤其是在 CI 环境中,并将有助于在生产中保持最佳性能。

有关更多详细信息和示例,请访问我们的 DevOps 指南其他功能教程

我们热切地期待您对这些新功能的看法和建议。请随时在 GitHub 问题 上分享您的经验和想法。