从/向缓存保存和恢复软件包¶
警告
此功能是实验性的,并且可能会发生重大更改。请参阅 Conan 稳定性 部分以获取更多信息。
使用 conan cache save
和 conan 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”、“source”和食谱“metadata”。
缓存中的“source”文件夹可以使用
conan cache save --no-source
参数跳过。这意味着如果恢复的食谱需要在恢复的缓存中构建新的二进制文件,它将没有源代码,并且如果食谱source()
方法指定,它将尝试下载它们。该命令会保存“package”和软件包“metadata”文件夹的内容,但不保存二进制文件的“build”或“download”文件夹,这些都被视为临时文件夹。
如果用户不想保存这些文件夹中的任何一个,可以在保存之前使用
conan cache clean
命令清理它们该命令会保存缓存文件、工件以及元数据(修订版、package_id),以便能够在另一个缓存中恢复这些软件包。但它不保存任何其他缓存状态,例如
settings.yml
、global.conf
、remotes
等。如果保存的软件包需要任何其他特定配置,应使用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 版本可能会破坏使用先前版本创建的存储格式。(这与上面不将其用作备份策略的建议一致)