Help us learn about your current experience with the documentation. Take the survey.

包注册表中的 Conan 2 包

  • 等级:Free, Premium, Ultimate
  • 提供:GitLab.com, GitLab Self-Managed, GitLab Dedicated
  • 状态:实验性

此功能的可用性由功能标志控制。有关更多信息,请参见历史记录。

GitLab 的 Conan 2 包注册表正在开发中,由于功能有限,尚不适用于生产环境。此史诗详细说明了剩余工作和时间表,以使其可用于生产环境。

Conan 2 注册表不符合 FIPS 标准,启用 FIPS 模式时会禁用。

在项目的包注册表中发布 Conan 2 包。然后在需要将它们用作依赖项时安装这些包。

要将 Conan 2 包发布到包注册表,请将包注册表添加为远程并进行身份验证。

然后你就可以运行 conan 命令,并将你的包发布到包注册表。

有关 Conan 2 包管理器客户端使用的特定 API 端点的文档,请参见 Conan v2 API

学习如何构建 Conan 2 包

将包注册表添加为 Conan 远程

要运行 conan 命令,你必须将包注册表添加为项目或实例的 Conan 远程。然后你就可以将包发布到包注册表,并从包注册表安装包。

为你的项目添加远程

设置一个远程,这样你就可以在项目中使用包,而不必在每个命令中都指定远程名称。

当你为项目设置远程时,包名必须是小写。此外,你的命令必须包含完整的配方,包括用户和通道,例如 package_name/version@user/channel

要添加远程:

  1. 在终端中运行此命令:

    conan remote add gitlab https://gitlab.example.com/api/v4/projects/<project_id>/packages/conan
  2. 通过在 Conan 2 命令末尾添加 --remote=gitlab 来使用远程。

    例如:

    conan search hello* --remote=gitlab

向包注册表进行身份验证

GitLab 需要身份验证才能上传包,以及从私有和内部项目安装包。(但是,你可以无需身份验证就从公共项目安装包。)

要向包注册表进行身份验证,你需要以下之一:

如果你未进行身份验证,来自私有和内部项目的包将被隐藏。如果你尝试在未进行身份验证的情况下搜索或下载来自私有或内部项目的包,你会在 Conan 2 客户端中收到错误 unable to find the package in remote

将你的凭据添加到 GitLab 远程

将你的令牌与 GitLab 远程关联,这样你就不必在每个 Conan 2 命令中都明确添加令牌。

先决条件:

在终端中运行此命令。在此示例中,远程名称为 gitlab。使用你的远程名称。

conan remote login -p <personal_access_token or deploy_token> gitlab <gitlab_username or deploy_token_username>

现在,当你运行带有 --remote=gitlab 的命令时,你的用户名和密码将包含在请求中。

由于你与 GitLab 的身份验证会定期过期,你可能偶尔需要重新输入你的个人访问令牌。

发布 Conan 2 包

将 Conan 2 包发布到包注册表,这样任何可以访问项目的人都可以将该包用作依赖项。

先决条件:

要发布包,请使用 conan upload 命令:

conan upload hello/0.1@mycompany/beta -r gitlab

使用 CI/CD 发布 Conan 2 包

要在 GitLab CI/CD 中使用 Conan 2 命令,你可以在命令中使用 CI_JOB_TOKEN 替代个人访问令牌。

你可以在 .gitlab-ci.yml 文件中为每个 Conan 命令提供 CONAN_LOGIN_USERNAMECONAN_PASSWORD。例如:

create_package:
  image: <conan 2 image>
  stage: deploy
  script:
    - conan remote add gitlab ${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/conan
    - conan new <package-name>/0.1
    - conan create . --channel=stable --user=mycompany
    - CONAN_LOGIN_USERNAME=ci_user CONAN_PASSWORD=${CI_JOB_TOKEN} conan upload <package-name>/0.1@mycompany/stable --remote=gitlab
  environment: production

请遵循官方指南创建适当的 Conan 2 镜像,用作 CI 文件的基础。

重新发布具有相同配方的包

当你发布一个与现有包具有相同配方(package-name/version@user/channel)的包时,Conan 会跳过上传,因为它们已经在服务器上了。

安装 Conan 2 包

从包注册表安装 Conan 2 包,以便你可以将其用作依赖项。你可以从项目的范围内安装包。如果多个包具有相同的配方,当你安装包时,会获取最新发布的包。

Conan 2 包通常通过使用 conanfile.txt 文件作为依赖项安装。

先决条件:

  1. 按照 Conan 2 包指南创建另一个包。在你的项目根目录中,创建一个名为 conanfile.txt 的文件。

  2. 将 Conan 配方添加到文件的 [requires] 部分:

    [requires]
    hello/0.1@mycompany/beta
  3. 在你的项目根目录中,创建一个 build 目录并切换到该目录:

    mkdir build && cd build
  4. 安装 conanfile.txt 中列出的依赖项:

    conan install ../conanfile.txt

如果你尝试安装本教程中创建的包,安装命令不会生效,因为该包已存在。 使用此命令在本地删除现有包,然后重试:

conan remove hello/0.1@mycompany/beta

删除 Conan 2 包

有两种方法可以从 GitLab 包注册表中删除 Conan 2 包。

  • 从命令行,使用 Conan 2 客户端:

    conan remove hello/0.1@mycompany/beta --remote=gitlab

    你必须在此命令中明确包含远程,否则包只会从你的本地系统缓存中删除。

    此命令会从包注册表中删除所有配方和二进制包文件。

  • 从 GitLab 用户界面:

    转到你的项目的 Deploy > Package registry。通过选择 Remove repository ( remove ) 来删除包。

在包注册表中搜索 Conan 2 包

要通过完整或部分包名,或精确配方进行搜索,请运行 conan search 命令。

  • 要搜索具有特定包名的所有包:

    conan search hello --remote=gitlab
  • 要搜索部分名称,例如所有以 he 开头的包:

    conan search "he*" --remote=gitlab

你的搜索范围取决于你的 Conan 远程配置。只要你有权限访问目标项目,你的搜索将包括该项目中的所有包。

搜索结果限制为 500 个包,结果按最新发布的包排序。

下载 Conan 2 包

你可以使用 conan download 命令将 Conan 2 包的配方和二进制文件下载到你的本地缓存,而无需使用设置。

先决条件:

下载所有二进制包

你可以从包注册表下载与配方关联的所有二进制包。

要下载所有二进制包,请运行以下命令:

conan download hello/0.1@mycompany/beta --remote=gitlab

下载配方文件

你可以只下载配方文件,而不下载任何二进制包。

要下载配方文件,请运行以下命令:

conan download hello/0.1@mycompany/beta --remote=gitlab --only-recipe

下载特定的二进制包

你可以通过引用其包引用(在 Conan 2 文档中称为 package_id)来下载单个二进制包。

要下载特定的二进制包,请运行以下命令:

conan download Hello/0.1@foo+bar/stable:<package_reference> --remote=gitlab

支持的 CLI 命令

GitLab Conan 存储库支持以下 Conan 2 CLI 命令:

  • conan upload:将你的配方和包文件上传到包注册表
  • conan install:从包注册表安装 Conan 2 包,包括使用 conanfile.txt 文件
  • conan download:将包配方和二进制文件下载到你的本地缓存,而无需使用设置
  • conan search:搜索包注册表中的公共包,以及你有权限查看的私有包
  • conan list:列出现有的配方、修订版或包
  • conan remove:从包注册表中删除包

Conan 修订版

Conan 修订版在包注册表中提供包的不变性。当你更改配方或包而不更改其版本时,Conan 会计算一个唯一标识符(修订版)来跟踪这些更改。

修订版类型

Conan 使用两种类型的修订版:

  • 配方修订版 (RREV):在导出配方时生成。默认情况下,Conan 使用配方清单的校验和哈希值计算配方修订版
  • 包修订版 (PREV):在构建包时生成。Conan 使用包内容的哈希值计算包修订版

引用修订版

你可以使用以下格式引用包:

引用 描述
lib/1.0@conan/stable lib/1.0@conan/stable 的最新 RREV
lib/1.0@conan/stable#RREV lib/1.0@conan/stable 的特定 RREV
lib/1.0@conan/stable#RREV:PACKAGE_REFERENCE 属于特定 RREV 的二进制包
lib/1.0@conan/stable#RREV:PACKAGE_REFERENCE#PREV 属于特定 RREV 的二进制包修订版 PREV

上传修订版

要将所有修订版及其二进制文件上传到 GitLab 包注册表:

conan upload "hello/0.1@mycompany/beta#*" --remote=gitlab

当你上传多个修订版时,它们会从最旧到最新上传。相对顺序在注册表中保留。

列出修订版

要在 Conan 2 中列出特定配方的所有修订版:

conan list "hello/0.1@mycompany/beta#*" --remote=gitlab

此命令显示指定配方的所有可用修订版,以及它们的修订版哈希和创建日期。

要获取特定修订版的详细信息:

conan list "hello/0.1@mycompany/beta#revision_hash:*#*" --remote=gitlab

此命令向你显示该修订版可用的特定二进制包和包修订版。

删除带修订版的包

你可以以不同的粒度级别删除包:

删除特定配方修订版

要删除特定配方修订版及其所有关联的二进制包:

conan remove "hello/0.1@mycompany/beta#revision_hash" --remote=gitlab

删除特定配方修订版的包

要删除与特定配方修订版关联的所有包:

conan remove "hello/0.1@mycompany/beta#revision_hash:*" --remote=gitlab

删除修订版中的特定包

要删除配方修订版中的特定包,你可以使用:

conan remove "package_name/version@user/channel#revision_hash:package_id" --remote=gitlab

不可变修订版工作流

修订版设计为不可变的。当你修改配方或其源代码时:

  • 在导出配方时会创建新的配方修订版
  • 属于先前配方修订版的任何现有二进制文件都不会包含在内。你必须为新配方修订版构建新的二进制文件
  • 当你安装包时,Conan 2 会自动检索最新的修订版,除非你指定了修订版

对于包二进制文件,你应该每个配方修订版和包引用(在 Conan 2 文档中称为 package_id)只包含一个包修订版。同一配方修订版和包 ID 的多个包修订版表示包被不必要地重建了。