Partager via


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 :

  1. La correspondance -- boost exacte est choisie sur boost*
  2. Le modèle -- boost* le plus long est choisi sur b*
  3. 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 registre https://github.com/vicroms/vcpkg-registry (correspondance exacte sur beicode)
  • beison: à partir du Registre https://github.com/Microsoft/vcpkg-docs (correspondance de modèle sur beison 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 :

  1. Superpositions à partir de la ligne de commande dans l’ordre passé ;
  2. Superpositions de vcpkg-configuration.json en ordre; alors
  3. Superpositions des variables d’environnement dans l’ordre.VCPKG_OVERLAY_[PORTS|TRIPLETS]