项目设置

本教程所需的代码可在 examples2 仓库中找到,克隆该仓库并进入该文件夹。

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/ci/game

服务器仓库设置

我们需要在同一个服务器上设置 3 个不同的仓库。请确保 Artifactory 正在运行并可用。您可以从 下载页面 下载免费的 Artifactory CE 并在您自己的计算机上运行它,或者您可以使用 Docker。

$ docker run --name artifactory -d -p 8081:8081 -p 8082:8082 releases-docker.jfrog.io/jfrog/artifactory-cpp-ce:7.63.12
# Can be stopped with "docker stop artifactory"

启动后,您可以访问 https://:8081/ 进行检查(用户名:“admin”,密码:“password”)。如果您有其他可用的 Artifactory,只要能够在此创建新仓库,也可以使用它。

作为第一步,请登录 Web UI 并**创建 3 个不同的本地仓库**,分别命名为 developpackagesproducts

然后,根据 project_setup.py 文件,以下是配置服务器所需的必要环境变量。如果需要,请定义 ARTIFACTORY_URLARTIFACTORY_USER 和/或 ARTIFACTORY_PASSWORD 以适应您的设置。

# TODO: This must be configured by users
SERVER_URL = os.environ.get("ARTIFACTORY_URL", "https://:8081/artifactory/api/conan")
USER = os.environ.get("ARTIFACTORY_USER", "admin")
PASSWORD = os.environ.get("ARTIFACTORY_PASSWORD", "password")

初始依赖图

警告

  • 项目初始化将清除服务器上 3 个 developproductspackages 仓库中的内容。

  • 位于 examples2/ci/game 文件夹中的 .conanrc 文件定义了一个本地缓存,因此本教程中执行的命令不会污染或更改您的主 Conan 缓存。

$ python project_setup.py

这将执行多项任务:清理服务器仓库,为依赖图创建初始的 DebugRelease 二进制文件,并将它们上传到 develop 仓库,然后清理本地缓存。请注意,在此示例中,我们为了方便使用了 DebugRelease 作为我们的不同配置,但在实际情况中,这些将是不同的配置,例如 Windows/X86_64、Linux/x86_64、Linux/armv8 等,运行在不同的计算机上。

设置完成后,可以检查是否已定义这 3 个远程仓库,但只有 develop 远程仓库已启用,并且本地缓存中没有包。

$ conan remote list
products: https://:8081/artifactory/api/conan/products [Verify SSL: True, Enabled: False]
develop: https://:8081/artifactory/api/conan/develop [Verify SSL: True, Enabled: True]
packages: https://:8081/artifactory/api/conan/packages [Verify SSL: True, Enabled: False]

$ conan list *
Found 0 pkg/version recipes matching * in local cache
Local Cache
WARN: There are no matching recipe references

重要

远程仓库的顺序很重要。如果启用了 products 仓库,它的优先级将高于 develop 仓库,因此如果 products 仓库包含新版本,它们将从此仓库获取。

develop 仓库中的这些包依赖图是我们教程的起点,被假定为项目的一个功能性且稳定的“开发”状态,开发人员可以 conan install 来处理任何不同的包。

digraph repositories { node [fillcolor="lightskyblue", style=filled, shape=box] rankdir="LR"; subgraph cluster_0 { label="Packages server"; style=filled; color=lightgrey; subgraph cluster_1 { label = "packages\n repository" shape = "box"; style=filled; color=lightblue; "packages" [style=invis]; } subgraph cluster_2 { label = "products\n repository" shape = "box"; style=filled; color=lightblue; "products" [style=invis]; } subgraph cluster_3 { rankdir="BT"; shape = "box"; label = "develop repository"; color=lightblue; rankdir="BT"; node [fillcolor="lightskyblue", style=filled, shape=box] "game/1.0" -> "engine/1.0" -> "ai/1.0" -> "mathlib/1.0"; "engine/1.0" -> "graphics/1.0" -> "mathlib/1.0"; "mapviewer/1.0" -> "graphics/1.0"; "game/1.0" [fillcolor="lightgreen"]; "mapviewer/1.0" [fillcolor="lightgreen"]; } { edge[style=invis]; "packages" -> "products" -> "game/1.0" ; rankdir="BT"; } } }