使用 Conan 备份第三方源¶
对于开源、公开可用的库的配方和构建脚本,通常的做法是从规范源(如 Github 发布版或项目下载网页)下载源文件。记录这些文件的来源对于可追溯性很有用,但是,不能保证这些文件在长期内可用,并且未来从源构建相同配方的用户可能会遇到问题。因此,可以配置 Conan 以从配置的镜像透明地检索源,而无需修改配方或 conandata.yml。此外,这些源可以通过 conan upload 与软件包一起透明地上传。
源备份 功能旨在将下载的配方源存储在您自己基础设施中的文件服务器中,从而即使原始下载 URL 不再可访问,也能保证构建的未来可重复性。
当提供 sha256 文件签名时,对 download 和 get 方法的调用会触发备份。
配置概述¶
此功能由几个 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和GETHTTP 方法来修改和获取其内容。如果需要访问凭据(强烈建议用于上传权限),可以使用 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指向的文件夹将包含,对于每个下载的文件 一个带有在
get/download中提供的sha256签名的名称的 blob 文件(无扩展名)。一个
.json文件,它也将具有sha256签名名称,其中将包含有关此 blob 属于哪些引用和哪些镜像的信息。
- 一旦某些源被本地下载,
如果设置了
core.sources:upload_url,调用conan upload现在将可选地上传与匹配引用对应的备份。
注意
请参阅下文 以获取有关如何配置自己的备份服务器的指南
设置必要的配置¶
如果希望从自定义备份源远程下载,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 命令安装配置。 更多信息请阅读 此处
像往常一样运行 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 仓库时,如果配置为这样做,它还会将相同引用的源备份上传到您的备份远程,并且未来此配方的源下载将根据需要使用新更新的内容。
注意
请参阅 软件包列表功能 以便仅上传已构建的软件包
如果需要上传与任何软件包未链接的源的备份,或者对于已经存在于远程仓库中的软件包(因此在上传期间将被跳过),可以使用 conan cache backup-upload 命令来解决此场景。
创建备份仓库¶
您还可以设置自己的远程备份仓库,而不是依赖于已经可用的仓库。虽然 Artifactory 通用仓库(Artifactory CE 免费提供)是为此目的推荐的,但任何允许使用 PUT 和 GET HTTP 方法来修改和获取其内容的简单服务器就足够了。
阅读以下部分,了解如何创建通用的 Artifactory 备份仓库以及如何授予其公共读取权限,同时仅允许授权代理进行写入访问