套件名稱解析

vcpkg 會先判斷每個套件的負責任登錄(或重疊),再連絡網路。 這可防止套件相依性混淆攻擊,因為名稱解析不相依於任何外部狀態。

名稱解析演算法步驟如下:

  • 如果在重疊中找到 名稱,請使用該重疊;否則為
  • 如果有 "packages" 符合埠名稱的模式,請使用該登錄;否則
  • 如果默認登錄不是 null,請使用該登錄;否則為
  • 無法將埠解析為登錄。

當有多個 "packages" 模式符合名稱時,vcpkg 會依下列方式排列優先順序:

  1. 已選擇完全相符 -- boost 專案 boost*
  2. 選擇最長的模式 -- boost*b*
  3. 第一個比 對 -- 已選擇宣告最佳模式的第一個登錄

範例 #1:套件名稱解析

vcpkg-configuration.json

{
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/northwindtraders/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["bei*"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/vicroms/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["beicode", "bei*"]
    }
  ]
}

vcpkg.json

{
  "dependencies": [ 
    "beicode", 
    "beison",
    "fmt"
  ],
  "builtin-baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
}

鑒於此組態,每個套件名稱都會解析為:

  • beicode:從登錄 https://github.com/vicroms/vcpkg-registry (完全相符於 beicode
  • beison:來自登錄 https://github.com/northwindtraders/vcpkg-registry (模式比對 , beison 並在陣列中 "registries" 宣告第一個)
  • fmt:來自預設登錄 (沒有相符專案)

由於多個登錄宣告 bei*,vcpkg 也會發出警告:

Found the following problems in configuration (path/to/vcpkg-configuration.json):
$ (a configuration object): warning: Package "bei*" is duplicated.
    First declared in:
        location: $.registries[0].packages[0]
        registry: https://github.com/northwindtraders/vcpkg-registry
    The following redeclarations will be ignored:
        location: $.registries[1].packages[1]
        registry: https://github.com/vicroms/vcpkg-registry

範例 #2:將多個模式指派給默認登錄

您可以透過兩種方式變更預設登錄。 首先,藉由定義 "default-registry"

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
  }
}

其次,藉由將 設定 "default-registry"null ,並使用 "*" 數位中的 "registries" 模式:

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*"]
    }
  ]
}

第二種表單的優點是您可以將更多專案新增至封裝陣列,而 "default-registry" 物件完全不允許您定義封裝陣列。 在您需要確保套件來自預設登錄的情況下,這種差異會變得很重要。

讓我們考慮提供 Qt Framework 連結庫的登錄。

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

以及下列專案相依性:

vcpkg.json

{
  "dependencies": [ 
    "qt5", 
    "qt-advanced-docking-system", 
    "qtkeychain" 
  ]
}

模式 "qt*" 符合 中的所有 vcpkg.json埠名稱。 但有問題! qt-advanced-docking-system埠和 qtkeychain 不是官方 Qt Framework 連結庫的一部分,因為 vcpkg 將無法在自定義登錄中找到埠,安裝將會失敗。

您可以將這些套件指派給預設登錄,以修正此問題。 我們藉由變更宣告默認登錄的方式,並將 和 qtkeychain 新增qt-advanced-docking-system至其"packages"陣列來完成:

vcpkg-configuration.json

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*", "qt-advanced-docking-system", "qtkeychain"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

因為完全相符專案比模式比對優先, qt-advanced-docking-system 而且 qtkeychain 會解析為默認登錄。

覆蓋

重疊是使用其他埠和額外三胞胎來擴充 vcpkg 的方法,而不需建立完整的登錄。 重疊會在執行任何登錄查閱或版本設定之前考慮,並將取代任何內建的三胞胎或埠。 若要深入瞭解,請參閱重 迭檔

重疊設定會依下列順序進行評估:

  1. 依傳遞的順序從 命令行 重疊;然後
  2. 重疊來源 vcpkg-configuration.json 依序排列;然後
  3. 依序從環境變數VCPKG_OVERLAY_[PORTS|TRIPLETS]疊。