Paketnamenauflösung
vcpkg bestimmt die verantwortliche Registrierung (oder Überlagerung) für jedes Paket, bevor es an das Netzwerk gelangt. Dadurch werden Paketabhängigkeitsverwechslungsangriffe verhindert, da die Namensauflösung nicht von einem externen Zustand abhängt.
Die Schritte des Namensauflösungsalgorithmus sind:
- Wenn der Name in einer Überlagerung gefunden wird, verwenden Sie diese Überlagerung; andernfalls
- Wenn es eine
"packages"
Muster, das dem Portnamen entspricht, verwenden Sie diese Registrierung; sonst - Wenn die Standardregistrierung nicht
null
lautet, verwenden Sie diese Registrierung; andernfalls - Fehler beim Auflösen des Ports zu einer Registrierung.
Wenn mehrere "packages"
Muster mit dem Namen übereinstimmen, priorisiert vcpkg wie folgt:
- Genaue Übereinstimmung --
boost
wird ausgewählt.boost*
- Das längste Muster --
boost*
wird überb*
- First match - The first registry declaring the best pattern is chosen
Beispiel Nr. 1: Paketnamenauflösung
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"
}
Bei dieser Konfiguration wird jeder Paketname in Folgendes aufgelöst:
beicode
: aus der Registrierunghttps://github.com/vicroms/vcpkg-registry
(genaue Übereinstimmung beibeicode
)beison
: aus der Registrierunghttps://github.com/Microsoft/vcpkg-docs
(Mustervergleich zuerstbeison
im"registries"
Array aktiviert und deklariert)fmt
: von der Standardregistrierung (keine Übereinstimmungen)
Da mehrere Registrierungen deklarieren bei*
, gibt vcpkg auch eine Warnung aus:
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
Beispiel Nr. 2: Zuweisen mehrerer Muster zur Standardregistrierung
Sie können die Standardregistrierung auf zwei Arten ändern. Definieren Sie zunächst Folgendes "default-registry"
:
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
Zweitens durch Festlegen des "default-registry"
null
Musters auf und Verwenden des "*"
"registries"
Musters im Array:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Ein Vorteil des zweiten Formulars besteht darin, dass Sie dem Paketarray weitere Einträge hinzufügen können, während das "default-registry"
Objekt überhaupt kein Paketarray definieren kann. Dieser Unterschied wird in Fällen wichtig, in denen Sie sicherstellen müssen, dass ein Paket aus der Standardregistrierung stammt.
Betrachten wir eine Registrierung, die die Qt Framework-Bibliotheken bereitstellt.
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*"]
}
]
}
Und die folgenden Projektabhängigkeiten:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Das "qt*"
Muster entspricht allen Portnamen in vcpkg.json
. Aber es gibt ein Problem! Die Ports qt-advanced-docking-system
sind qtkeychain
nicht Teil der offiziellen Qt Framework-Bibliotheken und da vcpkg die Ports in der benutzerdefinierten Registrierung nicht finden kann, schlägt die Installation fehl.
Dies kann behoben werden, indem sie diese Pakete stattdessen der Standardregistrierung zuweisen.
Wir erreichen dies, indem wir die Art und Weise ändern, wie wir die Standardregistrierung deklarieren und zu seinem "packages"
Array hinzufügen qt-advanced-docking-system
und qtkeychain
hinzufügen:
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*"]
}
]
}
Da genaue Übereinstimmungen gegenüber Musterüberstimmungen bevorzugt werden und qt-advanced-docking-system
qtkeychain
in die Standardregistrierung aufgelöst werden.
Überlagerungsports
Überlagerungsports sind eine Möglichkeit, vcpkg mit zusätzlichen Ports zu erweitern, ohne eine vollständige Registrierung zu erstellen. Überlagerungen werden vor registrierungsbasierten Nachschlagevorgängen oder Versionsverwaltungsaspekten berücksichtigt. Überlagerungen ersetzen alle integrierten Triplets oder Ports. Weitere Informationen finden Sie unter Überlagerungsports .
Überlagerungsports werden in dieser Reihenfolge ausgewertet:
- Überlagerungen aus der Befehlszeile
--overlay-ports
in der übergebenen Reihenfolge. - Überlagerungen von
vcpkg-configuration.json
"overlay-ports"
in der Reihenfolge; dann - Überlagerungen aus der
VCPKG_OVERLAY_PORTS
Umgebungsvariablen in der Reihenfolge.
Überlagerungs-Triplets
Overlay-Triplets sind eine Möglichkeit, vcpkg mit zusätzlichen Triplets zu erweitern, ohne das Installationsverzeichnis von vcpkg zu ändern. Überlagerungen werden vor integrierten Triplets berücksichtigt.
Overlay-Triplets werden in dieser Reihenfolge ausgewertet:
- Überlagerungen aus der Befehlszeile in der übergebenen Reihenfolge.
- Überlagerungen von
vcpkg-configuration.json
schrittweise; dann - Überlagerungen aus der
VCPKG_OVERLAY_TRIPLETS
Umgebungsvariablen in der Reihenfolge.