从缓存中保存和恢复包

警告

此功能处于实验阶段,可能会发生重大更改。有关更多信息,请参阅 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(任何版本)的包、所有包二进制文件的最后一个配方修订版和最后一个包修订版。可以使用可选的 --file=xxxx 参数更改文件名。一些重要的注意事项

  • 该命令保存缓存“recipe”文件夹的内容,其中包含子文件夹“export”、“export_sources”、“download”、“source”和配方“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 版本可能会破坏使用先前版本创建的存储格式。(这与上述不将其用作备份策略的建议相一致)