产品流水线:单一配置¶
在本节中,我们将实现一个非常基本的产品流水线,不分发构建,不使用锁文件或构建多个配置。
主要思想是说明为什么需要重新构建一些包,因为有一个新的 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.0
和 mapviewer/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
,并且对于 game/1.0
与这个新版本的 ai
不会有预编译的二进制文件。这是正确的,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
仓库。但由于这是一个非常基础和简单的流水线,让我们暂时搁置这一点,继续进行更高级的场景。