【问题标题】:How to update a dependency to a specific git commit when using manifest mode?使用清单模式时如何将依赖项更新为特定的 git 提交?
【发布时间】:2022-10-25 17:34:25
【问题描述】:

我有一个使用 vcpkg 来管理其依赖项的 cmake 项目。 vcpkg 用于“清单模式”。这意味着我的依赖项在位于项目根目录的 vcpkg.json 中指定:

{
    "name": "myproject",
    "version-string": "1.0.0",
    "builtin-baseline": "232704deb708fc866905af170b63c1a9cb821dbc",
    "dependencies": [
        {
          "name" : "imgui",
          "default-features": true,
          "features" : ["docking-experimental"]
        },
        "magnum",
        {
          "name" : "magnum-integration",        
          "default-features": false,
          "features" : ["imgui"]
        }
    ]
}

"builtin-baseline" 字段包含 git SHA-1 标识我自己私人维护的 vcpkg 存储库中的提交。

例如,magnum 依赖项配置为使用最新的“基线”版本。这意味着如果您转到安装 vcpkg 的位置,则会有一个文件 versions/baseline.json 确定基线。

vcpkg 有一个(复杂且不直观的)机制将某些依赖项固定到旧版本。但是,我找不到如何修改 vcpkg 安装的结构化方法,因此它将安装与 git 存储库不同的版本。 vcpkg“覆盖端口”功能在清单模式下不起作用。

理想情况下,vcpkg 可以让我做一些简单的事情,例如:

    "magnum",
        {
          "git-commit" : "dagfaghsfdg",
          "name" : "magnum-integration",        
          "default-features": false,
          "features" : ["imgui"]
        }

那么如何配置 vcpkg 以将某个 git commit 用于依赖项(在清单模式下)?

【问题讨论】:

    标签: vcpkg


    【解决方案1】:

    目前我想出的解决方案如下。我不确定它是否理想。

    我将在“magnum”依赖项上进行演示。

    第一步:修改相关的vcpkg/portfile.cmake

    通常,该文件将包含对名为 vcpkg_from_github 的函数的调用,该函数引用 git 标记(REF 参数)。修改此参数以引用所需的提交。

    vcpkg_from_github(
        OUT_SOURCE_PATH SOURCE_PATH
        REPO mosra/magnum
        REF 49bcbed2f4799e7b341975a5dde98d4ba4d288d8
        SHA512 08582553725ee63eb4c6732fa6a7d82e8e0a1fed92e0e9d82035c2aa79b0df29f1fdef521768f1ef8399cef8b4550e3a8734c3a0c4f04c40ecdb7fd6c99e1bc5
        HEAD_REF master
    )
    

    SHA512 也需要更改。但是因为 vcpkg 喜欢搞事情,所以不能自动推导出来。您必须尝试在包上安装 vcpkg,失败,获取实际值,然后手动设置:

    vcpkg install magnum
    
    File does not have expected hash:
    
              File path: [ C:/Libraries/vcpkg/downloads/mosra-magnum-72ee390afa8dd1f9d94355595ff4dc74408977fc.tar.gz ]
          Expected hash: [ 08582553725ee63eb4c6732fa6a7d82e8e0a1fed92e0e9d82035c2aa79b0df29f1fdef521768f1ef8399cef8b4550e3a8734c3a0c4f04c40ecdb7fd6c99e1bc5 ]
            Actual hash: [ 08582553725ee63eb4c6732fa6a7d82e8e0a1fed92e0e9d82035c2aa79b0df29f1fdef521768f1ef8399cef8b4550e3a8734c3a0c4f04c40ecdb7fd6c99e1bc4 ]
    

    SHA512 参数替换为Actual hash 中的值。

    第二步:修改vcpkg/vcpkg.json中的版本字符串

    在这个文件里面有一个版本字段。将其更改为有意义的东西。

      "name": "magnum",
      "version-string": "2022.00",
      "port-version": 0
    

    我还将port-version 更改为0。

    步骤 3:修改基线

    如果您希望使用非清单模式,第 1 步和第 2 步就足够了。 但是,如果您希望使用清单,则必须修改基线。

    在 versions/baseline.json 中,将基线更改为新版本(与端口文件匹配)。

    "magnum": {
      "baseline": "2022.00",
      "port-version": 0
    },
    

    第四步:注册新版本

    在版本目录中,有按字母顺序排列的目录,其中的文件列出了每个库的可用版本。例如 magnum.json:

      "versions": [
        {
          "git-tree": "39331fa0e35e058c25f2ee188ca816343111c232",
          "version-string": "2022.00",
          "port-version": 0
        },
        ...
    

    所以你需要添加一个新的版本条目。 现在“git-tree”字段是不是一个 git 提交。它是一个 git 对象 ID。 为了得到它,您需要首先提交您对 vcpkg 目录所做的所有当前更改,然后执行以下操作:

    git rev-parse HEAD:ports/magnum
    

    将输出复制到 git-tree 字段。

    第 5 步:对您更改的依赖项的其他依赖项重复此操作

    就我而言,magnum 依赖于“corrade”库,因此我必须在那里进行相同的更改。

    第 6 步:更改内置基线

    将所有更改提交到 vcpkg 存储库,修改清单文件 (vcpkg.json) builtin-baseline 字段以引用 vcpkg 存储库中的最新提交。

    【讨论】: