包流水线:使用锁定文件的多配置¶
在之前的示例中,我们为 ai/1.1.0
构建了 Debug
和 Release
包二进制文件。在实际场景中,需要构建的二进制文件将适用于不同的平台(Windows、Linux、嵌入式),不同的架构,而且很多时候不可能在同一台机器上构建它们,需要使用不同的计算机。
之前的示例有一个重要的假设:ai/1.1.0
的依赖在构建过程中完全不会改变。在许多场景中,这个假设不成立,例如如果有其他并发的 CI 作业,并且其中一个成功的作业在 develop
仓库中发布了一个新的 mathlib/1.1
版本。
那么 ai/1.1.0
的某个构建(例如在 Linux 服务器上运行的构建)可能启动得更早,并使用旧的 mathlib/1.0
版本作为依赖,而 Windows 服务器稍晚启动,它们的构建将使用最新的 mathlib/1.1
版本作为依赖。这种情况非常不理想,同一 ai/1.1.0
版本的二进制文件使用了不同的依赖版本。这可能导致后续的依赖图解析问题,或者更糟的是,导致不同平台在发布时表现不同。
避免这种依赖差异的方法是强制使用相同的依赖版本和修订,这可以通过锁定文件来完成。
创建和应用锁定文件相对简单。创建和推广配置的过程将与上一节完全相同,只是应用了锁定文件。
创建锁定文件¶
像往常一样,我们先确保从干净的状态开始
$ conan remove "*" -c # Make sure no packages from last run
然后我们可以创建锁定文件 conan.lock
# Capture a lockfile for the Release configuration
$ conan lock create . -s build_type=Release --lockfile-out=conan.lock
# extend the lockfile so it also covers the Debug configuration
# in case there are Debug-specific dependencies
$ conan lock create . -s build_type=Debug --lockfile=conan.lock --lockfile-out=conan.lock
请注意,使用不同配置、不同 Profile 或设置可能会导致不同的依赖图。锁定文件可以用来锁定不同的配置,但重要的是要迭代不同的配置/Profile,并在锁定文件中捕获它们的信息。
注意
conan.lock
是默认参数,如果存在 conan.lock
文件,它可能会被 conan install/create
和其他图形命令自动使用。这可以简化许多命令,但本教程出于清晰和教学目的显示了完整的显式命令。
conan.lock
文件可以被检查,它将看起来像这样
{
"version": "0.5",
"requires": [
"mathlib/1.0#f2b05681ed843bf50d8b7b7bdb5163ea%1724319985.398"
],
"build_requires": [],
"python_requires": [],
"config_requires": []
}
如我们所见,它锁定了 mathlib/1.0
依赖的版本和修订。
有了锁定文件,创建不同配置的过程完全相同,但需要在 conan create
步骤中提供 --lockfile=conan.lock
参数,这将保证 mathlib/1.0#f2b05681ed843bf50d8b7b7bdb5163ea
始终是使用的精确依赖,无论是否存在新的 mathlib/1.1
版本或新的修订。以下构建可以并行启动,但在不同的时间执行,它们仍然会始终使用相同的 mathlib/1.0
依赖
$ cd ai # If you were not inside "ai" folder already
$ conan create . --build="missing:ai/*" --lockfile=conan.lock -s build_type=Release --format=json > graph.json
$ conan list --graph=graph.json --graph-binaries=build --format=json > built.json
$ conan remote enable packages
$ conan upload -l=built.json -r=packages -c --format=json > uploaded_release.json
$ conan remote disable packages
$ conan create . --build="missing:ai/*" --lockfile=conan.lock -s build_type=Debug --format=json > graph.json
$ conan list --graph=graph.json --graph-binaries=build --format=json > built.json
$ conan remote enable packages
$ conan upload -l=built.json -r=packages -c --format=json > uploaded_debug.json
$ conan remote disable packages
注意,与之前的示例唯一的修改是添加了 --lockfile=conan.lock
。推广过程也将与之前相同
# aggregate the package list
$ conan pkglist merge -l uploaded_release.json -l uploaded_debug.json --format=json > uploaded.json
$ conan remote enable packages
$ conan remote enable products
# Promotion using Conan download/upload commands
# (slow, can be improved with art:promote custom command)
$ conan download --list=uploaded.json -r=packages --format=json > promote.json
$ conan upload --list=promote.json -r=products -c
$ conan remote disable packages
$ conan remote disable products
最终结果将与上一节相同,但这次保证了 Debug
和 Release
二进制文件都使用了完全相同的 mathlib
版本
现在我们将新的 ai/1.1.0
二进制文件放入 products
仓库,我们可以认为 包流水线
已完成,然后继续下一节,构建并检查我们的产品,看看这个新的 ai/1.1.0
版本是否正确集成。