conan lock merge

$ conan lock merge -h
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

conan lock merge 命令接受 2 个或更多 lockfile 并将其聚合,生成一个最终的 lockfile。 例如,如果我们有 2 个 lockfile lock1.locklock2.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 revisions,则必须包含时间戳才能正确排序。

警告

  • 禁止手动操作 Conan lockfile,更改引用的严格排序,这可能会导致任何任意的未定义行为。

  • 请记住,无法 conan lock add 版本范围。 该版本可能不完全完整(例如,未提供 revision),但它必须是确切的版本。

参见

为了更好地理解 conan lock merge,建议首先了解 lockfile 的一般概念,请访问 lockfiles 教程 以获得对 lockfile 的实践性介绍。

当由于某些原因导致多个 lockfile 发散时,此 conan lock merge 命令可用于在单个 lockfile 中进行整合。 一种用例是创建一个多配置 lockfile,其中包含所有操作系统(Linux,Windows 等)所需的所有锁定版本,即使不同操作系统的图中存在条件依赖项。 例如,在测试新的依赖项版本 pkg/3.4 新版本时,如果之前 pkg/3.3 已经存在于图中,我们可能希望拥有一个新的 lockfile 清理之前的 pkg/3.3。 如果我们应用 --lockfile-clean 参数,它将删除 lockfile 中未使用的版本,但也会删除与操作系统相关的依赖项。 因此,可以执行以下操作:假设我们有这个 lockfile(简化,为了简单起见删除了 revisions),作为测试我们的主要产品 app1/0.1 的新 pkgb/0.2 版本的的结果

app.lock
{
  "version": "0.5",
  "requires": [
      "pkgb/0.2",
      "pkgb/0.1",
      "pkgawin/0.1",
      "pkganix/0.1",
      "app1/0.1"
  ]
}

pkgawinpkganix 是分别仅存在于 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"
  ]
}