Paket adı çözümlemesi
vcpkg, ağa ulaşmadan önce her paket için sorumlu kayıt defterini (veya yer paylaşımını) belirler. Bu, ad çözümlemesi herhangi bir dış duruma bağlı olmadığından paket Bağımlılık karışıklığı saldırılarını önler.
Ad çözümleme algoritması adımları şunlardır:
- Ad bir katmanda bulunursa bu katmanı kullanın; aksi takdirde
- Bir
"packages"
bağlantı noktası adıyla eşleşen desen, bu kayıt defterini kullanın; yoksa - Varsayılan kayıt defteri değilse
null
, bu kayıt defterini kullanın; aksi takdirde - Kayıt defterine bağlantı noktası çözümlenememesi.
Adla eşleşen birden çok "packages"
desen olduğunda, vcpkg aşağıdaki gibi önceliklendirir:
- Tam eşleşme --
boost
seçilirboost*
- En uzun desen --
boost*
seçilirb*
- İlk eşleşme -- En iyi deseni belirten ilk kayıt defteri seçilir
Örnek #1: Paket adı çözümlemesi
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"
}
Bu yapılandırma göz önüne alındığında, her paket adı şu şekilde çözümlenecektir:
beicode
: kayıt defterindenhttps://github.com/vicroms/vcpkg-registry
(üzerinde tam eşleşmebeicode
)beison
: kayıt defterindenhttps://github.com/Microsoft/vcpkg-docs
(dizide"registries"
ilk olarak bildirilen ve üzerindebeison
desen eşleşmesi)fmt
: varsayılan kayıt defterinden (eşleşme yok)
Birden çok kayıt defteri bildirdiğinden bei*
, vcpkg bir uyarı da yayar:
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
Örnek 2: Varsayılan kayıt defterine birden çok desen atama
Varsayılan kayıt defterini iki şekilde değiştirebilirsiniz. İlk olarak, öğesini tanımlayarak "default-registry"
:
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
İkincisi, öğesini olarak ayarlayarak "default-registry"
null
ve dizideki deseni "*"
"registries"
kullanarak:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
İkinci formun bir avantajı, packages dizisine daha fazla girdi ekleyebilmenizdir, "default-registry"
ancak nesne bir paket dizisi tanımlamanıza hiç izin vermez. Bu fark, bir paketin varsayılan kayıt defterinden geldiğinden emin olmanız gereken durumlarda önemli hale gelir.
Qt Framework kitaplıklarını sağlayan bir kayıt defteri düşünelim.
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*"]
}
]
}
Ve aşağıdaki proje bağımlılıkları:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Desen içindeki "qt*"
tüm bağlantı noktası adlarında vcpkg.json
eşleşir. Ama bir sorun var! ve qtkeychain
bağlantı noktaları qt-advanced-docking-system
resmi Qt Framework kitaplıklarının bir parçası değildir ve vcpkg özel kayıt defterindeki bağlantı noktalarını bulamayacağından yükleme başarısız olur.
Bunun yerine bu paketler varsayılan kayıt defterine atanarak bu düzeltilebilir.
Bunu, varsayılan kayıt defterini bildirme şeklimizi değiştirerek ve dizinine "packages"
ve qtkeychain
ekleyerek qt-advanced-docking-system
gerçekleştiririz:
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*"]
}
]
}
Tam eşleşmeler desen qt-advanced-docking-system
eşleşmeleri yerine tercih edildiğinden ve qtkeychain
varsayılan kayıt defterine çözümlenir.
Bindirmeler
Yer paylaşımları, tam kayıt defteri oluşturmadan vcpkg'yi ek bağlantı noktaları ve ek üçlülerle genişletmenin bir yoludur. Katmanlar, herhangi bir kayıt defteri araması veya sürüm oluşturma işlemi gerçekleştirmeden önce dikkate alınır ve yerleşik üçlü veya bağlantı noktalarının yerini alır. Daha fazla bilgi edinmek için bkz . yer paylaşımı bağlantı noktaları .
Katman ayarları şu sırada değerlendirilir:
- Komut satırından geçirilen sırayla yer paylaşımları; ardından
- Yer paylaşımları:
vcpkg-configuration.json
sırayla; sonra - Ortam değişkenlerinden
VCPKG_OVERLAY_[PORTS|TRIPLETS]
sırayla yer paylaşımları .