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.
Porte sovrapposte
Le porte di sovrapposizione sono un modo per estendere vcpkg con porte aggiuntive senza creare un registro completo. Le sovrimpressioni vengono considerate prima di eventuali ricerche del Registro di sistema o considerazioni sul controllo delle versioni. Le sovrimpressioni sostituiscono tutte le triplette o le porte predefinite. Per altre informazioni, vedere Sovrimpressione delle porte .
Le porte di sovrapposizione vengono valutate in questo ordine:
- Sovrappone dalla riga
--overlay-ports
di comando nell'ordine passato; - Sovrapposizioni da
vcpkg-configuration.json
"overlay-ports"
in ordine; - Sovrimpressione dalla
VCPKG_OVERLAY_PORTS
variabile di ambiente in ordine.
Triplette sovrapposte
I tripli sovrapposti sono un modo per estendere vcpkg con triplette aggiuntive, senza modificare la directory di installazione di vcpkg. Le sovrimpressioni vengono considerate prima di qualsiasi tripletta incorporata.
I tripli sovrapposti vengono valutati in questo ordine:
- Sovrappone dalla riga di comando nell'ordine passato;
- Sovrapposizioni da
vcpkg-configuration.json
in ordine; allora - Sovrimpressione dalla
VCPKG_OVERLAY_TRIPLETS
variabile di ambiente in ordine.