conan lock merge

$ conan lock merge -h
usage: conan lock merge [-h] [--out-file OUT_FILE]
                        [-v [{quiet,error,warning,notice,status,,verbose,debug,v,trace,vv}]]
                        [-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 [{quiet,error,warning,notice,status,,verbose,debug,v,trace,vv}]
                        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。例如,如果我们有两个 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

  • 配方修订版本(如果已定义)必须包含时间戳才能正确排序。

警告

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

  • 请记住,无法 conan lock add 版本范围。版本可能不完全完整(例如,没有提供修订版本),但它必须是一个确切的版本。

另请参阅

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

这个 conan lock merge 命令在某些原因导致多个 lockfile 分叉时,可以用于将它们合并到一个 lockfile 中。一个用例是创建一个多配置 lockfile,其中包含所有操作系统(Linux、Windows 等)所需的所有锁定版本,即使在不同操作系统的图中有条件依赖。例如,在测试新依赖版本时,比如 pkg/3.4 的新版本,而之前图中已有 pkg/3.3,我们可能希望有一个新的 lockfile 来清理之前的 pkg/3.3。如果我们应用 --lockfile-clean 参数,它将删除 lockfile 中未使用的版本,但这也会删除与操作系统相关的依赖项。因此,可以这样做:假设我们有这个 lockfile(已简化,为简单起见删除了修订版本),这是测试我们主要产品 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"
  ]
}