产品管线:单一配置

在本节中,我们将实现一个非常基础的产品管线,不进行分布式构建,不使用锁定文件,也不构建多种配置。

主要目的是说明,由于有新的 ai/1.1.0 版本可供我们的主要产品集成,因此需要重建一些包。这个新的 ai 版本位于 products 仓库中,因为它已经由“包管线”成功构建。我们首先确保拥有一个已定义正确仓库的干净环境。

# First clean the local "build" folder
$ pwd  # should be <path>/examples2/ci/game
$ rm -rf build  # clean the temporary build folder
$ mkdir build && cd build # To put temporary files

# Now clean packages and define remotes
$ conan remove "*" -c  # Make sure no packages from last run
# NOTE: The products repo is first, it will have higher priority.
$ conan remote enable products

回顾一下,products 仓库的优先级高于 develop 仓库。这意味着 Conan 将首先在 products 仓库中解析,如果它找到定义版本范围的有效版本,它将停止并返回该版本,而不再检查 develop 仓库(使用 --update 可以检查所有仓库,但这会更慢,并且在正确的仓库排序下,没有必要这样做)。

如我们之前所定义,我们的主要产品是 game/1.0mapviewer/1.0,让我们首先尝试安装并使用 mapviewer/1.0

$ conan install --requires=mapviewer/1.0
...
Requirements
    graphics/1.0#24b395ba17da96288766cc83accc98f5 - Downloaded (develop)
    mapviewer/1.0#c4660fde083a1d581ac554e8a026d4ea - Downloaded (develop)
    mathlib/1.0#f2b05681ed843bf50d8b7b7bdb5163ea - Downloaded (develop)
...
Install finished successfully

# Activate the environment and run the executable
# Use "conanbuild.bat && mapviewer" in Windows
$ source conanrun.sh && mapviewer
...
graphics/1.0: Checking if things collide (Release)!
mapviewer/1.0:serving the game (Release)!

如我们所见,mapviewer/1.0 根本不依赖于 ai 包的任何版本。因此,如果我们安装它,我们就会有一个它的预编译二进制文件,一切都正常工作。

但是如果现在我们用 game/1.0 尝试同样的操作:

$ conan install --requires=game/1.0
...
======== Computing necessary packages ========
...
ERROR: Missing binary: game/1.0:bac7cd2fe1592075ddc715563984bbe000059d4c

game/1.0: WARN: Cant find a game/1.0 package binary bac7cd2fe1592075ddc715563984bbe000059d4c for the configuration:
...
[requires]
ai/1.1.0#01a885b003190704f7617f8c13baa630

它会失败,因为它将从 products 仓库获取 ai/1.1.0,并且没有针对这个新 ai 版本的 game/1.0 预编译二进制文件。这是正确的,ai 是一个静态库,所以我们需要针对它重建 game/1.0,让我们使用 --build=missing 参数来完成。

$ conan install --requires=game/1.0 --build=missing
...
======== Computing necessary packages ========
Requirements
    ai/1.1.0:8b108997a4947ec6a0487a0b6bcbc0d1072e95f3 - Download (products)
    engine/1.0:de738ff5d09f0359b81da17c58256c619814a765 - Build
    game/1.0:bac7cd2fe1592075ddc715563984bbe000059d4c - Build
    graphics/1.0:8b108997a4947ec6a0487a0b6bcbc0d1072e95f3 - Download (develop)
    mathlib/1.0:4d8ab52ebb49f51e63d5193ed580b5a7672e23d5 - Download (develop)

-------- Installing package engine/1.0 (4 of 5) --------
engine/1.0: Building from source
...
engine/1.0: Package de738ff5d09f0359b81da17c58256c619814a765 created
-------- Installing package game/1.0 (5 of 5) --------
game/1.0: Building from source
...
game/1.0: Package bac7cd2fe1592075ddc715563984bbe000059d4c created
Install finished successfully

请注意,--build=missing 知道 engine/1.0 也需要一个新的二进制文件,因为它依赖于新的 ai/1.1.0 版本。然后,Conan 按照正确的顺序构建包,首先必须构建 engine/1.0,因为 game/1.0 依赖于它。构建完成后,我们可以列出新构建的二进制文件,并查看它们如何依赖于新版本。

$ conan list engine:*
Local Cache
  engine
    engine/1.0
      revisions
        fba6659c9dd04a4bbdc7a375f22143cb (2024-09-30 12:19:54 UTC)
          packages
            de738ff5d09f0359b81da17c58256c619814a765
              info
                ...
                requires
                  ai/1.1.Z
                  graphics/1.0.Z
                  mathlib/1.0.Z

$ conan list game:*
Local Cache
  game
    game/1.0
      revisions
        1715574045610faa2705017c71d0000e (2024-09-30 12:19:55 UTC)
          packages
            bac7cd2fe1592075ddc715563984bbe000059d4c
              info
                ...
                requires
                  ai/1.1.0#01a885b003190704f7617f8c13baa630:8b108997a4947ec6a0487a0b6bcbc0d1072e95f3
                  engine/1.0#fba6659c9dd04a4bbdc7a375f22143cb:de738ff5d09f0359b81da17c58256c619814a765
                  graphics/1.0#24b395ba17da96288766cc83accc98f5:8b108997a4947ec6a0487a0b6bcbc0d1072e95f3
                  mathlib/1.0#f2b05681ed843bf50d8b7b7bdb5163ea:4d8ab52ebb49f51e63d5193ed580b5a7672e23d5

新的 engine/1.0:de738ff5d09f0359b81da17c58256c619814a765 二进制文件依赖于 ai/1.1.Z,因为作为一个静态库,它只要求在次版本更改时重建,而不要求在补丁版本更改时重建。而 game/1.0 的新二进制文件将依赖于完整的精确 ai/1.1.0#revision:package_id,并且也依赖于依赖 ai/1.1.Z 的新 engine/1.0:de738ff5d09f0359b81da17c58256c619814a765 二进制文件。

现在游戏可以执行了。

# Activate the environment and run the executable
# Use "conanbuild.bat && game" in Windows
$ source conanrun.sh && game
mathlib/1.0: mathlib maths (Release)!
ai/1.1.0: SUPER BETTER Artificial Intelligence for aliens (Release)!
ai/1.1.0: Intelligence level=50
graphics/1.0: Checking if things collide (Release)!
engine/1.0: Computing some game things (Release)!
game/1.0:fun game (Release)!

我们可以看到,新的 game/1.0 二进制文件融合了 ai/1.1.0 中的改进,并与 engine/1.0 的新二进制文件正确链接。

这是一个基础的“产品管线”,我们成功地在必要时构建并测试了我们的主要产品(回顾一下,mapviewer 实际上没有受到影响,因此根本不需要重建)。通常,一个生产“产品管线”会完成将构建好的包上传到仓库,并进行新的“晋升”操作到 develop 仓库。但是由于这是一个非常基础和简单的管线,我们先等等,继续探讨更高级的场景。