Résolution de noms de package
vcpkg détermine le registre responsable (ou superposition) pour chaque package avant d’atteindre le réseau. Cela empêche les attaques de confusion des dépendances de package, car la résolution de noms ne dépend pas d’un état externe.
Les étapes de l’algorithme de résolution de noms sont les suivantes :
- Si le nom est trouvé dans une superposition, utilisez cette superposition ; sinon,
- S’il y a un
"packages"
modèle qui correspond au nom du port, utilisez ce registre ; autrement - Si le Registre par défaut n’est pas
null
, utilisez ce registre ; sinon, - Échec de la résolution du port dans un registre.
Lorsqu’il existe plusieurs "packages"
modèles qui correspondent au nom, vcpkg hiérarchise comme suit :
- La correspondance --
boost
exacte est choisie surboost*
- Le modèle --
boost*
le plus long est choisi surb*
- Première correspondance -- Le premier registre déclarant le meilleur modèle est choisi
Exemple #1 : Résolution de noms de package
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"
}
Étant donné cette configuration, chaque nom de package est résolu en :
beicode
: à partir du registrehttps://github.com/vicroms/vcpkg-registry
(correspondance exacte surbeicode
)beison
: à partir du Registrehttps://github.com/Microsoft/vcpkg-docs
(correspondance de modèle surbeison
et déclarée en premier dans"registries"
le tableau)fmt
: à partir du registre par défaut (aucune correspondance)
Étant donné que plusieurs registres déclarent bei*
, vcpkg émet également un avertissement :
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
Exemple n° 2 : Affecter plusieurs modèles au Registre par défaut
Vous pouvez modifier le Registre par défaut de deux façons. Tout d’abord, en définissant les "default-registry"
points suivants :
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
Ensuite, en définissant la "default-registry"
valeur et null
l’utilisation du "*"
modèle dans le "registries"
tableau :
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Un avantage du deuxième formulaire est que vous pouvez ajouter d’autres entrées au tableau de packages, tandis que l’objet "default-registry"
ne vous permet pas de définir un tableau de packages du tout. Cette différence devient importante dans les cas où vous devez vous assurer qu’un package provient du registre par défaut.
Prenons un registre qui fournit les bibliothèques 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*"]
}
]
}
Et les dépendances de projet suivantes :
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Le "qt*"
modèle correspond à tous les noms de port dans vcpkg.json
. Mais il y a un problème ! Les ports qt-advanced-docking-system
et qtkeychain
ne font pas partie des bibliothèques Qt Framework officielles et, étant donné que vcpkg ne pourra pas trouver les ports dans le registre personnalisé, l’installation échoue.
Cela peut être résolu en affectant ces packages au registre par défaut.
Pour ce faire, nous modifions la façon dont nous déclarons le registre par défaut et nous ajoutons qt-advanced-docking-system
et qtkeychain
à son "packages"
tableau :
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*"]
}
]
}
Étant donné que les correspondances exactes sont préférées aux correspondances de modèle et qt-advanced-docking-system
qtkeychain
sont résolues vers le Registre par défaut.
Superpositions
Les superpositions sont un moyen d’étendre vcpkg avec des ports supplémentaires et des triplets supplémentaires, sans créer de registre complet. Les superpositions sont prises en compte avant d’effectuer des recherches ou des versions de Registre et remplacent les triplets ou ports intégrés. Pour en savoir plus, consultez les ports de superposition.
Les paramètres de superposition sont évalués dans cet ordre :
- Superpositions à partir de la ligne de commande dans l’ordre passé ;
- Superpositions de
vcpkg-configuration.json
en ordre; alors - Superpositions des variables d’environnement dans l’ordre.
VCPKG_OVERLAY_[PORTS|TRIPLETS]