套件名稱解析
vcpkg 會先判斷每個套件的負責任登錄(或重疊),再連絡網路。 這可防止套件相依性混淆攻擊,因為名稱解析不相依於任何外部狀態。
名稱解析演算法步驟如下:
- 如果在重疊中找到 名稱,請使用該重疊;否則為
- 如果有
"packages"
符合埠名稱的模式,請使用該登錄;否則 - 如果默認登錄不是
null
,請使用該登錄;否則為 - 無法將埠解析為登錄。
當有多個 "packages"
模式符合名稱時,vcpkg 會依下列方式排列優先順序:
- 已選擇完全相符 --
boost
專案boost*
- 選擇最長的模式 --
boost*
b*
- 第一個比 對 -- 已選擇宣告最佳模式的第一個登錄
範例 #1:套件名稱解析
vcpkg-configuration.json
{
"registries": [
{
"kind": "git",
"repository": "https://github.com/microsoft/vcpkg-docs",
"reference": "vcpkg-registry",
"baseline": "768f6a3ad9f9b6c4c2ff390137690cf26e3c3453",
"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/Microsoft/vcpkg-docs
(模式比對 ,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/microsoft/vcpkg-docs
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 的方法,而不需建立完整的登錄。 重疊會在任何登錄查閱或版本控制考慮之前考慮。 重疊會取代任何內建三胞胎或埠。 若要深入瞭解,請參閱 重迭埠 。
重迭埠會依下列順序進行評估:
- 依傳遞的順序從命令行
--overlay-ports
重疊;然後 - 重疊來源
vcpkg-configuration.json
"overlay-ports"
依序排列;然後 - 依序從環境變數重
VCPKG_OVERLAY_PORTS
疊。
重疊三重迭
重迭三胞胎是使用其他三胞胎擴充 vcpkg 的方法,而不需要修改 vcpkg 的安裝目錄。 重疊會在任何內建三胞胎之前考慮。
重迭三胞胎會依下列順序進行評估:
- 依傳遞的順序從 命令行 重疊;然後
- 重疊來源
vcpkg-configuration.json
挨次;然後 - 依序從環境變數重
VCPKG_OVERLAY_TRIPLETS
疊。