Risoluzione dei nomi del pacchetto
vcpkg determina il Registro di sistema responsabile (o sovrimpressione) per ogni pacchetto prima di raggiungere la rete. In questo modo si evitano gli attacchi di confusione sulle dipendenze del pacchetto perché la risoluzione dei nomi non dipende da alcuno stato esterno.
I passaggi dell'algoritmo di risoluzione dei nomi sono:
- Se il nome viene trovato in una sovrimpressione, usare tale sovrimpressione; in caso contrario,
- Se c'è un
"packages"
pattern che corrisponde al nome della porta, usare tale registro; altrimenti - Se il Registro di sistema predefinito non
null
è , usare tale registro; in caso contrario, - Non è possibile risolvere la porta in un registro.
Quando sono presenti più "packages"
modelli che corrispondono al nome, vcpkg assegna la priorità come indicato di seguito:
- Viene scelta la corrispondenza --
boost
esattaboost*
- Viene scelto il modello --
boost*
più lungob*
- Prima corrispondenza : viene scelto il primo registro che dichiara il modello migliore
Esempio n. 1: Risoluzione dei nomi del pacchetto
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"
}
Data questa configurazione, ogni nome del pacchetto viene risolto in:
beicode
: dal Registro di sistemahttps://github.com/vicroms/vcpkg-registry
(corrispondenza esatta inbeicode
)beison
: from registryhttps://github.com/Microsoft/vcpkg-docs
(pattern match onbeison
and declared first in"registries"
array)fmt
: dal Registro di sistema predefinito (nessuna corrispondenza)
Poiché più registri dichiarano bei*
, vcpkg genererà anche un avviso:
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
Esempio 2: Assegnare più modelli al Registro di sistema predefinito
È possibile modificare il Registro di sistema predefinito in due modi. Per prima cosa, definendo :"default-registry"
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
In secondo luogo, impostando su "default-registry"
null
e usando il "*"
criterio nella "registries"
matrice:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Un vantaggio del secondo modulo è che è possibile aggiungere altre voci alla matrice di pacchetti, mentre l'oggetto "default-registry"
non consente di definire una matrice di pacchetti. Questa differenza diventa importante nei casi in cui è necessario assicurarsi che un pacchetto provenga dal Registro di sistema predefinito.
Si consideri ora un registro che fornisce le librerie 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*"]
}
]
}
E le dipendenze del progetto seguenti:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Il "qt*"
modello corrisponde a tutti i nomi di porta in vcpkg.json
. Ma c'è un problema! Le porte qt-advanced-docking-system
e qtkeychain
non fanno parte delle librerie ufficiali di Qt Framework e poiché vcpkg non sarà in grado di trovare le porte nel Registro di sistema personalizzato, l'installazione avrà esito negativo.
Questo problema può essere risolto assegnando questi pacchetti al Registro di sistema predefinito.
A tale scopo, modificando il modo in cui dichiariamo il Registro di sistema predefinito e aggiungendo qt-advanced-docking-system
e qtkeychain
alla relativa "packages"
matrice:
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*"]
}
]
}
Poiché le corrispondenze esatte sono preferibili rispetto alle corrispondenze qt-advanced-docking-system
dei criteri e qtkeychain
verranno risolte nel Registro di sistema predefinito.
Sovrimpressioni
Le sovrimpressioni sono un modo per estendere vcpkg con porte aggiuntive e triplette aggiuntive, senza creare un registro completo. Le sovrimpressioni vengono considerate prima di eseguire ricerche o controllo delle versioni del Registro di sistema e sostituiranno eventuali triplette o porte predefinite. Per altre informazioni, vedere Sovrimpressione delle porte .
Le impostazioni di sovrapposizione vengono valutate in questo ordine:
- Sovrappone dalla riga di comando nell'ordine passato;
- Sovrapposizioni da
vcpkg-configuration.json
in ordine; allora - Sovrappone le variabili di
VCPKG_OVERLAY_[PORTS|TRIPLETS]
ambiente in ordine.