使用 Conan 备份第三方来源¶
对于开源的、公开可用的库,其配方和构建脚本通常从标准来源(如 Github releases 或项目下载网页)下载。保留这些文件的来源记录对于可追溯性很有用,但通常不能保证文件能长期可用,未来从源代码构建相同配方的用户可能会遇到问题。因此,Conan 可以配置为透明地从配置的镜像中检索源代码,而无需修改配方或 conandata.yml。此外,这些源代码可以通过 conan upload 命令与包一起透明地上传。
源代码备份功能旨在将下载的配方源代码存储在您自己基础设施中的文件服务器中,即使原始下载 URL 不再可用,也能实现未来构建的可重现性。
当调用 download 和 get 方法且提供了 sha256
文件签名时,将触发备份。
配置概览¶
此功能由几个 global.conf 项控制
core.sources:download_cache
: 用于存储源代码备份的本地路径。如果未设置,将使用默认的 Conan 主缓存路径。core.sources:download_urls
: Conan 将尝试从中下载源代码的 URL 列表,其中origin
代表从 conandata.yml 传递给get
/download
的原始 URL。这允许控制获取顺序,例如["origin", "https://your.backup/remote/"]
,只有在原始源代码不存在时才查找并从您的备份远程获取;或者["https://your.backup/remote/", "origin"]
,优先从您的备份服务器获取,而不是配方的标准链接。由于它是一个列表,因此也可以使用多个远程。默认情况下为["origin"]
core.sources:upload_url
: 调用 conan upload 时上传备份的远程 URL,该 URL 可能与为下载定义的任何 URL 不同,也可能相同。默认为空core.sources:exclude_urls
: 要跳过备份的来源列表。如果传递给get
/download
的 URL 以此列表中的任何来源开头,则在调用 conan upload 时不会将源代码上传到备份远程。默认为空
用法¶
让我们通过一个端到端的示例用法来概述该功能的工作原理
总而言之,它看起来像这样
设置一个远程备份仓库。这应该允许
PUT
和GET
HTTP 方法来修改和获取其内容。如果需要访问凭据(强烈建议用于上传权限),可以使用 source_credentials.json 功能。如果您需要配置自己的,请 参见下方。然后,可以在
core.sources:download_urls
和core.sources:upload_url
中设置远程 URL。在您配方的
source()
方法中,请确保相关的get
/download
调用提供了下载文件的sha256
签名。如果需要自定义备份的本地缓存路径,请在您的 global.conf 文件中设置
core.sources:download_cache
,否则将使用默认缓存文件夹。正常运行 Conan,创建包等。
- 一旦一些源代码被本地下载,指向
core.sources:download_cache
的文件夹将包含每个下载的文件: 一个没有扩展名的 blob 文件,其名称是
get
/download
中提供的sha256
签名。一个
.json
文件,其名称也与sha256
签名相同,其中包含有关此 blob 属于哪些引用和哪些镜像的信息。
- 一旦一些源代码被本地下载,指向
调用
conan upload
现在将选择性地上传匹配引用的备份,前提是设置了core.sources:upload_url
。
注意
有关如何配置自己的备份服务器的指南,请 参见下方。
设置必要的配置¶
如果希望从自定义备份源远程下载,global.conf 文件应包含 core.sources:download_urls
;如果希望自定义本地缓存路径来下载备份,则应包含 core.sources:download_cache
。
core.sources:download_urls=["https://myteam.myorg.com/artifactory/backup-sources/", "origin"]
core.sources:download_cache=/path/to/backup/sources
注意
为了启用该功能,应定义 core.sources:download_urls
或 core.sources:download_cache
之一。
您可能需要根据您的用例添加额外的配置,如 本文档开头 所述。
注意
建议在组织中配置 CI 工作器和开发人员的方法是使用存储库上的 conan config install
命令来安装配置。在此处阅读更多信息 here。
正常运行 Conan¶
完成上述步骤后,Conan 现在可以正常使用。对于每个下载的源代码,Conan 会首先查找 core.sources:download_cache
指示的文件夹,如果未在此处找到,则会遍历 core.sources:download_urls
,直到找到文件或失败,并将本地副本存储在相同的 core.sources:download_cache
位置。
当从备份远程获取备份时,将向用户显示类似如下的消息:
$ conan create . --version=1.3
...
======== Installing packages ========
zlib/1.3: Calling source() in /Users/ruben/.conan2/p/zlib0f4e45286ecd1/s/src
zlib/1.3: Sources for ['https://zlib.net/fossils/zlib-1.3.tar.gz', 'https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz']
found in remote backup https://myteam.myorg.com/artifactory/backup-sources
-------- Installing package zlib/1.3 (1 of 1) --------
...
如果我们现在再次尝试运行此命令,我们将发现没有执行下载,而是使用了本地存储的文件版本。
上传包¶
如上所示创建了包之后,当调用 conan upload zlib/1.3 -c
将生成的二进制文件上传到您的 Conan 仓库时,如果配置了备份,它还将把该相同引用的源代码备份上传到您的备份远程,并且将来对该配方的源代码下载将在必要时使用新更新的内容。
注意
请参阅 packages list feature 以了解仅上传已构建的包的方法。
如果需要上传与任何包无关的源代码的备份,或者已经存在于远程且因此在上传过程中被跳过的包的备份,则可以使用 conan cache backup-upload 命令来处理这种情况。
创建备份仓库¶
您也可以设置自己的远程备份仓库,而不是依赖于已有的仓库。虽然 Artifactory 通用仓库(Artifactory CE 提供免费)推荐用于此目的,但任何允许 PUT
和 GET
HTTP 方法来修改和获取其内容的简单服务器就足够了。
请阅读以下部分,了解如何创建通用 Artifactory 备份仓库以及如何为其授予公共读取权限,同时只允许授权代理写入访问。