保存和恢复缓存中的软件包

警告

此功能是实验性的,可能会有重大更改。有关更多信息,请参阅Conan 稳定性部分。

通过 conan cache saveconan cache restore 命令,可以从 Conan 缓存中的一个或多个软件包创建 .tgz 文件,并在之后将这些软件包恢复到另一个 Conan 缓存中。以下是一些可能有用的场景:

  • 在持续集成中,特别是如果进行分布式构建,能够移动最近构建的临时软件包可能非常方便。大多数 CI 系统都具有为此目的在作业之间传输文件的能力。Conan 缓存不是并发的,有时并行作业必须使用不同的缓存。

  • 对于气隙环境,软件包只能通过客户端传输。

  • 开发人员直接与其他开发人员共享一些软件包以进行测试或检查。

保存软件包的过程是使用 conan cache save 命令。它可以像 conan list 命令一样使用模式,但它也可以像其他命令(如 remove, upload, download)一样接受软件包列表。例如:

$ conan cache save "pkg/*:*"
Saving pkg/1.0: p/pkg1df6df1a3b33c
Saving pkg/1.0:9a4eb3c8701508aa9458b1a73d0633783ecc2270: p/b/pkgd573962ec2c90/p
Saving pkg/1.0:9a4eb3c8701508aa9458b1a73d0633783ecc2270 metadata: p/b/pkgd573962ec2c90/p
...
# creates conan_cache_save.tgz

conan_cache_save.tgz 文件包含名为 pkg(任何版本)的软件包、最新的 recipe 修订版本以及所有软件包二进制文件的最新软件包修订版本。可以使用可选的 --file=xxxx 参数更改文件名。一些重要的注意事项:

  • 该命令保存缓存 “recipe” 文件夹的内容,其中包含子文件夹 “export”、“export_sources”、“download”、“source” 和 recipe “metadata”。

  • 该命令保存 “package” 和软件包 “metadata” 文件夹的内容,但不保存二进制 “build” 或 “download” 文件夹,这些文件夹被认为是临时文件夹。

  • 如果用户不希望保存这些文件夹中的任何一个,他们可以在保存之前使用 conan cache clean 命令清除它们。

  • 该命令保存缓存文件和工件以及元数据(修订版本、package_id),以便能够在另一个缓存中恢复这些软件包。但它不保存任何其他缓存状态,如 settings.ymlglobal.confremotes 等。如果保存的软件包需要任何其他特定配置,则应使用 conan config install 进行管理。

我们可以将 conan_cache_save.tgz 文件移动到另一个 Conan 缓存并按如下方式恢复它:

$ conan cache restore conan_cache_save.tgz
Restore: pkg/1.0 in p/pkg1df6df1a3b33c
Restore: pkg/1.0:9a4eb3c8701508aa9458b1a73d0633783ecc2270 in p/b/pkg773791b8c97aa/p
Restore: pkg/1.0:9a4eb3c8701508aa9458b1a73d0633783ecc2270 metadata in p/b/pkg773791b8c97aa/d/metadata
...

如果缓存中已存在软件包,恢复过程将覆盖现有软件包。

注意

最佳实践

  • 保存和恢复软件包不能替代在 Conan 服务器仓库中正确存储(上传)软件包。它仅用作一种过渡机制,在 CI 系统中,用于节省气隙等,而不是作为长期存储和检索。

  • 保存和恢复软件包不能替代服务器仓库的正确备份。实施 Conan 软件包长期备份的推荐方法是使用一些服务器端备份策略。

  • 目前不保证存储格式和序列化在未来是安全和稳定的。它有望在相同的 Conan 版本中工作,但未来的 Conan 版本可能会破坏使用以前版本创建的存储格式。(这与上述不将其用作备份策略的建议一致)