# GitLab Conan Repository

> 原文：[https://docs.gitlab.com/ee/user/packages/conan_repository/](https://docs.gitlab.com/ee/user/packages/conan_repository/)

*   [Enabling the Conan Repository](#enabling-the-conan-repository)
*   [Getting started](#getting-started)
    *   [Installing Conan](#installing-conan)
    *   [Installing CMake](#installing-cmake)
    *   [Creating a project](#creating-a-project)
    *   [Building a package](#building-a-package)
*   [Adding the GitLab Package Registry as a Conan remote](#adding-the-gitlab-package-registry-as-a-conan-remote)
*   [Authenticating to the GitLab Conan Repository](#authenticating-to-the-gitlab-conan-repository)
    *   [Adding a Conan user to the GitLab remote](#adding-a-conan-user-to-the-gitlab-remote)
    *   [Setting a default remote to your project (optional)](#setting-a-default-remote-to-your-project-optional)
*   [Uploading a package](#uploading-a-package)
    *   [Package recipe naming convention](#package-recipe-naming-convention)
*   [Installing a package](#installing-a-package)
*   [Removing a package](#removing-a-package)
*   [Searching the GitLab Package Registry for Conan packages](#searching-the-gitlab-package-registry-for-conan-packages)
*   [Fetching Conan package information from the GitLab Package Registry](#fetching-conan-package-information-from-the-gitlab-package-registry)
*   [List of supported CLI commands](#list-of-supported-cli-commands)
*   [Using GitLab CI with Conan packages](#using-gitlab-ci-with-conan-packages)

# GitLab Conan Repository[](#gitlab-conan-repository-premium "Permalink")

[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8248) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.6.

有了 GitLab 柯南存储库，每个项目都可以有自己的空间来存储柯南软件包.

[![GitLab Conan Repository](img/5bf127e31dfc7f61e3134780f75114ff.png)](img/conan_package_view.png)

## Enabling the Conan Repository[](#enabling-the-conan-repository "Permalink")

**注意：**仅当您的 GitLab 管理员[启用了对 Conan Repository 的支持时，](../../../administration/packages/index.html)此选项才可用.

启用柯南存储库后，默认情况下它将可用于所有新项目. 要为现有项目启用它，或者要禁用它：

1.  导航到项目的**"设置">"常规">"可见性，项目功能，权限"** .
2.  找到"软件包"功能并启用或禁用它.
3.  单击**保存更改**以使更改生效.

然后，您应该能够在左侧栏中看到" **程序包和注册表"**部分.

## Getting started[](#getting-started "Permalink")

本节将介绍如何安装 Conan 以及为 C / C ++项目构建软件包. 如果您不熟悉柯南，这是一个快速入门. 如果您已经在使用 Conan 并且了解如何构建自己的软件包，请继续[下一节](#adding-the-gitlab-package-registry-as-a-conan-remote) .

### Installing Conan[](#installing-conan "Permalink")

按照[conan.io](https://conan.io/downloads.html)上的说明将 Conan 软件包管理器下载到本地开发环境.

安装完成后，通过运行以下命令验证您可以在终端中使用 Conan

```
conan --version 
```

您应该在输出中看到柯南版本：

```
Conan version 1.20.5 
```

### Installing CMake[](#installing-cmake "Permalink")

使用 C ++和 Conan 进行开发时，编译器有多种选择. 本教程将逐步介绍如何使用 cmake 编译器. 在您的终端中，运行命令

```
cmake --version 
```

您应该会在输出中看到 cmake 版本. 如果看到其他内容，则可能必须安装 cmake.

在 Mac 上，您可以通过运行`brew install cmake`来使用[自制软件](https://brew.sh/) `brew install cmake` . 否则，请按照[cmake.org 中](https://cmake.org/install/)针对您的操作系统的说明进行操作.

### Creating a project[](#creating-a-project "Permalink")

了解创建有效且可编译的 C ++项目所需的内容不在本指南的范围之内，但是，如果您是 C ++的新手，并且想尝试 GitLab 软件包注册表，那么 Conan.io 会提供一个很棒的[Hello World 入门项目](https://github.com/conan-io/hello)可以克隆以开始使用.

如果您没有自己的 C ++项目，请克隆该存储库，并将其用于本教程的其余部分.

### Building a package[](#building-a-package "Permalink")

在终端中，导航到项目的根文件夹. 通过运行`conan new`并为其提供程序包名称和版本来生成新配方：

```
conan new Hello/0.1 -t 
```

接下来，您将通过运行提供 Conan 用户和频道的`conan create`来为该配方创建一个程序包：

```
conan create . my-org+my-group+my-project/beta 
```

**注意：**当前的[命名限制](#package-recipe-naming-convention)要求您将`user`值[命名](#package-recipe-naming-convention)为项目在 GitLab 上的`+`分隔路径.

上面的示例将创建一个属于该项目的软件包： `https://gitlab.com/my-org/my-group/my-project` : `https://gitlab.com/my-org/my-group/my-project` ，其通道为`beta` .

这两个示例命令将使用配方`Hello/0.1@my-org+my-group+my-project/beta`生成最终软件包.

有关创建和管理软件包的更多高级详细信息，请参阅[Conan docs](https://docs.conan.io/en/latest/creating_packages.html) .

现在，您可以将软件包上传到 GitLab 注册表了. 首先，您需要将 GitLab 设置为远程，然后需要为该远程添加一个 Conan 用户以验证您的请求.

## Adding the GitLab Package Registry as a Conan remote[](#adding-the-gitlab-package-registry-as-a-conan-remote "Permalink")

Add a new remote to your Conan configuration:

```
conan remote add gitlab https://gitlab.example.com/api/v4/packages/conan 
```

一旦设置了遥控器，您就可以在运行 Conan 命令时使用遥控器，方法是在命令末尾添加`--remote=gitlab` .

例如：

```
conan search Hello* --all --remote=gitlab 
```

## Authenticating to the GitLab Conan Repository[](#authenticating-to-the-gitlab-conan-repository "Permalink")

您将需要一个个人访问令牌或部署令牌.

对于存储库身份验证：

*   您可以将范围设置为`api`来生成[个人访问令牌](../../../user/profile/personal_access_tokens.html) .
*   您可以生成[令牌部署](./../../project/deploy_tokens/index.html)与范围设置为`read_package_registry` ， `write_package_registry` ，或两者兼而有之.

### Adding a Conan user to the GitLab remote[](#adding-a-conan-user-to-the-gitlab-remote "Permalink")

一旦有了个人访问令牌并[设置了 Conan remote](#adding-the-gitlab-package-registry-as-a-conan-remote) ，就可以将令牌与远程关联，因此您不必将它们显式添加到您运行的每个 Conan 命令中：

```
conan user <gitlab_username or deploy_token_username> -r gitlab -p <personal_access_token or deploy_token> 
```

**注意：**如果您使用`gitlab`以外的名称来命名远程，则应在此命令中使用您的远程名称，而不是`gitlab` .

从现在开始，当您使用`--remote=gitlab`运行命令时，您的用户名和密码将自动包含在请求中.

**注意：**个人访问令牌不会随时存储在本地. Conan 使用 JWT，因此当您运行此命令时，Conan 将使用您的令牌从 GitLab 请求一个过期的令牌. JWT 确实会定期失效，因此您需要在这种情况下重新输入个人访问令牌.

或者，您可以在任何给定命令中显式包括您的凭据. 例如：

```
CONAN_LOGIN_USERNAME=<gitlab_username or deploy_token_username> CONAN_PASSWORD=<personal_access_token or deploy_token> conan upload Hello/0.1@my-group+my-project/beta --all --remote=gitlab 
```

### Setting a default remote to your project (optional)[](#setting-a-default-remote-to-your-project-optional "Permalink")

如果您希望柯南始终使用 GitLab 作为软件包的注册表，则可以告诉柯南始终为给定的软件包配方引用 GitLab 远程：

```
conan remote add_ref Hello/0.1@my-group+my-project/beta gitlab 
```

**注意：**软件包配方中确实包含该版本，因此为`Hello/0.1@user/channel`设置默认远程将不适用于`Hello/0.2@user/channel` . 此功能最适合需要从 GitLab 注册表使用或安装软件包而无需指定远程服务器的情况.

本文档中其余的示例命令假定您已将具有凭据的 Conan 用户添加到`gitlab`远程，并且不包括显式凭据或远程选项，但是请注意，可以在不添加任何命令的情况下运行任何命令.用户或默认遥控器：

```
`CONAN_LOGIN_USERNAME=<gitlab_username or deploy_token_username> CONAN_PASSWORD=<personal_access_token or deploy_token> <conan command> --remote=gitlab 
```

## Uploading a package[](#uploading-a-package "Permalink")

首先，您需要在[本地创建 Conan 软件包](https://docs.conan.io/en/latest/creating_packages/getting_started.html) . 为了使用 GitLab 软件包注册表，必须遵循特定的[命名约定](#package-recipe-naming-convention) .

通过选择`api` [范围，](../../../user/profile/personal_access_tokens.html#limiting-scopes-of-a-personal-access-token)确保在 GitLab 上创建了一个项目，并且所使用的个人访问令牌具有对容器注册表进行写访问的正确权限.

您可以使用`conan upload`命令将软件包上传到 GitLab 软件包注册表：

```
conan upload Hello/0.1@my-group+my-project/beta --all 
```

### Package recipe naming convention[](#package-recipe-naming-convention "Permalink")

标准柯南食谱约定看起来像`package_name/version@user/channel` .

**配方用户必须是`+`分隔的项目路径** . 程序包名称可以是任何名称，但最好使用项目名称，除非由于命名冲突而无法使用. 例如：

| Project | Package | Supported |
| --- | --- | --- |
| `foo/bar` | `my-package/1.0.0@foo+bar/stable` | Yes |
| `foo/bar-baz/buz` | `my-package/1.0.0@foo+bar-baz+buz/stable` | Yes |
| `gitlab-org/gitlab-ce` | `my-package/1.0.0@gitlab-org+gitlab-ce/stable` | Yes |
| `gitlab-org/gitlab-ce` | `my-package/1.0.0@foo/stable` | No |

**注意：**将来的迭代将扩展对[项目和组级别](https://gitlab.com/gitlab-org/gitlab/-/issues/11679)远程服务器的支持，这将允许更灵活的命名约定.

## Installing a package[](#installing-a-package "Permalink")

通常使用`conanfile.txt`文件将 Conan 软件包作为依赖项安装.

在要作为依赖项安装 Conan 软件包的项目中，打开`conanfile.txt`或在项目的根目录中创建一个名为`conanfile.txt`的空文件.

将柯南食谱添加到文件的`[requires]`部分：

```
 [requires]
 Hello/0.1@my-group+my-project/beta

 [generators]
 cmake 
```

接下来，从您的项目的根目录创建一个构建目录并导航到它：

```
mkdir build && cd build 
```

现在，您可以安装`conanfile.txt`列出的依赖`conanfile.txt` ：

```
conan install .. 
```

**注意：**如果您要安装在本教程中刚刚创建的软件包，则不会发生太多事情，因为该软件包已在本地计算机上存在.

## Removing a package[](#removing-a-package "Permalink")

有两种方法可以从 GitLab 软件包注册表中删除 Conan 软件包.

*   **在命令行中使用 Conan 客户端：**

    ```
    conan remove Hello/0.2@user/channel --remote=gitlab 
    ```

    您需要在此命令中明确包含遥控器，否则该程序包将仅从本地系统缓存中删除.

    **注意：**此命令将从软件包注册表中删除所有配方和二进制软件包文件.
*   **GitLab 项目界面** ：在项目页面的软件包视图中，您可以通过单击红色垃圾图标来删除软件包.

## Searching the GitLab Package Registry for Conan packages[](#searching-the-gitlab-package-registry-for-conan-packages "Permalink")

`conan search`命令可以按完整或部分软件包名称或精确配方进行搜索.

要使用部分名称进行搜索，请使用通配符`*` ，该通配符应放在搜索的末尾（例如， `my-packa*` ）：

```
conan search Hello --all --remote=gitlab
conan search He* --all --remote=gitlab
conan search Hello/0.1@my-group+my-project/beta --all --remote=gitlab 
```

搜索范围将包括您有权访问的所有项目，包括私人项目以及所有公共项目.

## Fetching Conan package information from the GitLab Package Registry[](#fetching-conan-package-information-from-the-gitlab-package-registry "Permalink")

`conan info`命令将返回有关给定软件包的信息：

```
conan info Hello/0.1@my-group+my-project/beta 
```

## List of supported CLI commands[](#list-of-supported-cli-commands "Permalink")

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

*   `conan upload` ：将您的配方和包文件上载到 GitLab 包注册表.
*   `conan install` ：从 GitLab 软件包注册表中安装`conanfile.txt`软件包，包括使用`conanfile.txt`文件.
*   `conan search`: Search the GitLab Package Registry for public packages, and private packages you have permission to view.
*   `conan info` ：从 GitLab 软件包注册表中查看有关给定软件包的信息.
*   `conan remove` ：从 GitLab 软件包注册表中删除该软件包.

## Using GitLab CI with Conan packages[](#using-gitlab-ci-with-conan-packages "Permalink")

[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11678) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.7.

要在[GitLab CI / CD 中](./../../../ci/README.html)使用柯南命令，可以在命令中使用`CI_JOB_TOKEN`代替个人访问令牌.

在`.gitlab-ci.yml`文件中为每个柯南命令提供`CONAN_LOGIN_USERNAME`和`CONAN_PASSWORD`是最简单的：

```
image: conanio/gcc7

create_package:
  stage: deploy
  script:
    - conan remote add gitlab https://gitlab.example.com/api/v4/packages/conan
    - conan create . my-group+my-project/beta
    - CONAN_LOGIN_USERNAME=ci_user CONAN_PASSWORD=${CI_JOB_TOKEN} conan upload Hello/0.1@root+ci-conan/beta1 --all --remote=gitlab 
```

您可以在[Conan 文档中](https://docs.conan.io/en/latest/howtos/run_conan_in_docker.html#available-docker-images)找到其他柯南图像用作 CI 文件的基础.