Package pipeline: 多配置使用lockfiles¶
在之前的例子中,我们构建了 Debug 和 Release 包二进制文件,用于 ai/1.1.0。在实际场景中,要构建的二进制文件可能是不同的平台(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 版本的二进制文件使用不同的依赖项版本。这可能导致后续的图解析问题,或者更糟糕的是,导致不同平台上的行为不同,最终发布。
避免依赖项差异的方法是强制使用相同的依赖项版本和修订版本,这可以使用 lockfiles 来完成。
创建和应用 lockfiles 相对简单。创建和提升配置的过程与上一节相同,只是应用 lockfiles。
创建 lockfile¶
让我们确保像往常一样从一个干净的状态开始
$ conan remove "*" -c # Make sure no packages from last run
然后我们可以创建 lockfile 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 或 settings 的不同配置可能会导致不同的依赖图。lockfile 文件可用于锁定不同的配置,但重要的是迭代不同的配置/profile 并将它们的信息捕获在 lockfile 中。
注意
默认情况下,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 依赖项的版本和修订版本。
有了 lockfile,创建不同的配置完全相同,但提供 --lockfile=conan.lock 参数给 conan create 步骤,将保证 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 版本构建的
现在我们已经在 products 仓库中有了新的 ai/1.1.0 二进制文件,我们可以认为 packages pipeline 完成,并进入下一节,构建和检查我们的产品,看看这个新的 ai/1.1.0 版本是否正确集成。