conan lock merge¶
$ conan lock merge -h
Migration: Successfully updated settings.yml
usage: conan lock merge [-h] [--out-file OUT_FILE] [-v [V]] [-cc CORE_CONF]
[--lockfile LOCKFILE] [--lockfile-out LOCKFILE_OUT]
Merge 2 or more lockfiles.
options:
-h, --help show this help message and exit
--out-file OUT_FILE Write the output of the command to the specified file
instead of stdout.
-v [V] Level of detail of the output. Valid options from less
verbose to more verbose: -vquiet, -verror, -vwarning,
-vnotice, -vstatus, -v or -vverbose, -vv or -vdebug,
-vvv or -vtrace
-cc CORE_CONF, --core-conf CORE_CONF
Define core configuration, overwriting global.conf
values. E.g.: -cc core:non_interactive=True
--lockfile LOCKFILE Path to lockfile to be merged
--lockfile-out LOCKFILE_OUT
Filename of the created lockfile
命令接收两个或多个 lockfile 并进行聚合,生成一个最终的 lockfile。例如,如果我们有两个 lockfile lock1.lock
和 lock2.lock
,我们可以将它们合并到一个最终的 conan.lock
中
# we have 2 lockfiles lock1.lock and lock2.lock
$ conan lock add --requires=pkg/1.1 --lockfile-out=lock1.lock
$ cat lock1.lock
{
"version": "0.5",
"requires": [
"pkg/1.1",
],
"build_requires": [],
"python_requires": []
}
$ conan lock add --requires=other/2.1 --build-requires=tool/3.2 --lockfile-out=lock2.lock
$ cat lock2.lock
{
"version": "0.5",
"requires": [
"other/2.1"
],
"build_requires": [
"tool/3.2"
],
"python_requires": []
}
# we can merge both
$ conan lock merge --lockfile=lock1.lock --lockfile=lock2.lock
$ cat conan.lock
{
"version": "0.5",
"requires": [
"pkg/1.1",
"other/2.1"
],
"build_requires": [
"tool/3.2"
],
"python_requires": []
}
与 conan lock add
命令类似,conan lock merge
确实保持版本列表的严格排序
它不执行任何关于软件包或版本是否存在,或它们是否属于给定依赖图的验证
它是一个对 json 文件进行聚合的基本处理。
它不保证 lockfile 是完整的,如果不是,可能需要
--lockfile-partial
参数如果定义了 recipe revision,必须包含时间戳才能正确排序。
警告
禁止手动修改 Conan lockfile,改变引用的严格排序,这可能导致任意未定义的行为。
请注意,不可能使用
conan lock add
添加版本范围。版本可能不完全(例如未提供 revision),但它必须是精确版本。
另请参阅
为了更好地理解 conan lock merge
,建议先了解 lockfile 的一般概念,请访问 lockfile 教程 获取关于 lockfile 的实践介绍。
当由于某些原因存在多个已分歧的 lockfile 时,此 conan lock merge
命令可用于将其整合到一个 lockfile 中。一个用例是创建一个多配置 lockfile,其中包含所有操作系统(Linux、Windows 等)所需的所有锁定版本,即使依赖图中有针对不同操作系统的条件依赖。在某个时间点测试新的依赖版本时,例如,之前依赖图中已有 pkg/3.3
,现在要测试 pkg/3.4
新版本,我们可能希望生成一个新的 lockfile,清除之前的 pkg/3.3
。如果我们使用 --lockfile-clean
参数,它将移除 lockfile 中未使用的版本,但这也会移除依赖于操作系统的依赖项。因此,可以这样做:假设我们有以下 lockfile(为简化已移除 revision),它是测试我们主要产品 app1/0.1
的新版本 pkgb/0.2
的结果
{
"version": "0.5",
"requires": [
"pkgb/0.2",
"pkgb/0.1",
"pkgawin/0.1",
"pkganix/0.1",
"app1/0.1"
]
}
pkgawin
和 pkganix
是分别仅存在于 Windows 和 Linux 中的依赖项。一切看起来都很好,新版本 pkgb/0.2
在我们的应用程序中运行良好,我们想清除 lockfile 中未使用的内容
$ conan lock create --requires=app1/0.1 --lockfile=app.lock --lockfile-out=win.lock -s os=Windows --lockfile-clean
# Note how both pkgb/0.1 and pkganix are gone
$ cat win.lock
{
"version": "0.5",
"requires": [
"pkgb/0.2",
"pkgawin/0.1",
"app1/0.1"
]
}
$ conan lock create --requires=app1/0.1 --lockfile=app.lock --lockfile-out=nix.lock -s os=Linux --lockfile-clean
# Note how both pkgb/0.1 and pkgawin are gone
$ cat win.lock
{
"version": "0.5",
"requires": [
"pkgb/0.2",
"pkganix/0.1",
"app1/0.1"
]
}
# Finally, merge the 2 clean lockfiles, for keeping just 1 for next iteration
$ conan lock merge --lockfile=win.lock --lockfile=nix.lock --lockfile-out=final.lock
$ cat final.lock
{
"version": "0.5",
"requires": [
"pkgb/0.2",
"pkgawin/0.1",
"pkganix/0.1",
"app1/0.1"
]
}