使用 Conan 备份第三方源

对于开源、公开可用的库的配方和构建脚本,通常的做法是从规范来源下载源,例如 Github 发布版本或项目下载网页。保留这些文件的来源记录对于可追溯性目的非常有用,但是,通常不能保证这些文件能够长期可用,并且将来从源代码构建相同配方的用户可能会遇到问题。因此,Conan 可以配置为从配置的镜像透明地检索源,而无需修改配方或 conandata.yml。此外,这些源可以与软件包一起通过 conan upload 透明地上传。

源备份功能旨在将下载的配方源存储在您自己的基础设施中的文件服务器中,即使原始下载 URL 不再可访问,也允许将来重现您的构建。

当为 downloadget 方法的调用提供 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 不同。 默认为空

  • core.sources:exclude_urls: 要跳过备份的来源列表。 如果传递给 get/download 的 URL 以此列表中包含的任何来源开头,则在调用 conan upload 时,源将不会上传到备份远程仓库。 默认为空

用法

让我们通过提供从头到尾的示例用法来概述该功能的工作方式

总之,它看起来像这样

  • 设置远程备份仓库。 这应该允许 PUTGET HTTP 方法来修改和获取其内容。 如果需要访问凭据(强烈建议用于上传权限),您可以使用 source_credentials.json 功能。 如果您需要配置自己的仓库,请参见下文

  • 然后可以将远程仓库的 URL 设置在 core.sources:download_urlscore.sources:upload_url 中。

  • 在您的配方的 source() 方法中,确保相关的 get/download 调用提供下载文件的 sha256 签名。

  • 如果需要自定义位置,请在您的 global.conf 文件中设置 core.sources:download_cache,否则将使用默认的缓存文件夹

  • 正常运行 Conan,创建软件包等。

  • 一旦在本地下载了一些源,core.sources:download_cache 指向的文件夹将包含每个下载的文件
    • 一个 blob 文件(没有扩展名),其名称是在 get/download 中提供的 sha256 签名。

    • 一个 .json 文件,其名称也将是 sha256 签名,其中将包含有关此 blob 所属的引用和镜像的信息。

  • 如果设置了 core.sources:upload_url,则调用 conan upload 现在将可选地上传匹配引用的备份。

注意

有关如何配置您自己的备份服务器的指南,请参见下文

设置必要的配置

global.conf 文件应包含 core.sources:download_urls(如果需要从自定义备份源远程仓库下载)和 core.sources:download_cache(如果需要自定义本地缓存路径来下载备份)。

global.conf
core.sources:download_urls=["https://myteam.myorg.com/artifactory/backup-sources/", "origin"]
core.sources:download_cache=/path/to/backup/sources

注意

应定义 core.sources:download_urlscore.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 免费提供),但任何允许 PUTGET HTTP 方法来修改和获取其内容的简单服务器就足够了。

阅读以下部分,了解有关如何创建通用 Artifactory 备份仓库以及如何为其提供公共读取权限的说明,同时仅为授权代理保留写入权限