从缓存中保存和恢复包

警告

此功能为实验性功能,可能会有破坏性更改。更多信息请参阅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”、“source”和 recipe “metadata”。

  • 可以使用 conan cache save --no-source 参数跳过缓存中的“source”文件夹。这意味着如果恢复的 recipe 在恢复的缓存中需要构建一个新的二进制文件,它将没有源文件,并且如果 recipe 的 source() 方法指示这样做,它将尝试下载它们。

  • 该命令保存“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 版本可能会破坏以前版本创建的存储格式。(这与上述不将其用作备份策略的建议一致)