Condividi tramite


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:

Quando sono presenti più "packages" modelli che corrispondono al nome, vcpkg assegna la priorità come indicato di seguito:

  1. Viene scelta la corrispondenza -- boost esatta boost*
  2. Viene scelto il modello -- boost* più lungo b*
  3. 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 sistema https://github.com/vicroms/vcpkg-registry (corrispondenza esatta in beicode)
  • beison: from registry https://github.com/Microsoft/vcpkg-docs (pattern match on beison 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:

  1. Sovrappone dalla riga di comando nell'ordine passato;
  2. Sovrapposizioni da vcpkg-configuration.json in ordine; allora
  3. Sovrappone le variabili di VCPKG_OVERLAY_[PORTS|TRIPLETS] ambiente in ordine.