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; Andernfalls - 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/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"
}
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/northwindtraders/vcpkg-registry
(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/northwindtraders/vcpkg-registry
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.
Überlagerungen
Überlagerungen sind eine Möglichkeit, vcpkg mit zusätzlichen Ports und zusätzlichen Triplets zu erweitern, ohne eine vollständige Registrierung zu erstellen. Überlagerungen werden berücksichtigt, bevor Sie Registrierungssuchen oder Versionsverwaltungen durchführen und alle integrierten Triplets oder Ports ersetzen. Weitere Informationen finden Sie in der Dokumentation zu Überlagerungen.
Überlagerungseinstellungen werden in dieser Reihenfolge ausgewertet:
- Überlagerungen aus der Befehlszeile in der übergebenen Reihenfolge.
- Überlagerungen von
vcpkg-configuration.json
in Der Reihenfolge; Dann - Überlagerungen aus den
VCPKG_OVERLAY_[PORTS|TRIPLETS]
Umgebungsvariablen in der reihenfolge.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für