Freigeben über


Paketnamenauflösung

vcpkg bestimmt die verantwortliche Registrierung (oder Überlagerung) für jedes Paket, bevor es an das Netzwerk gelangt. Dadurch werden Paketabhängigkeitsverwechslungsangriffe verhindert, da die Namensauflösung nicht von einem externen Zustand abhängt.

Die Schritte des Namensauflösungsalgorithmus sind:

  • Wenn der Name in einer Überlagerung gefunden wird, verwenden Sie diese Überlagerung; andernfalls
  • Wenn es eine "packages" Muster, das dem Portnamen entspricht, verwenden Sie diese Registrierung; sonst
  • Wenn die Standardregistrierung nicht nulllautet, verwenden Sie diese Registrierung; andernfalls
  • Fehler beim Auflösen des Ports zu einer Registrierung.

Wenn mehrere "packages" Muster mit dem Namen übereinstimmen, priorisiert vcpkg wie folgt:

  1. Genaue Übereinstimmung -- boost wird ausgewählt. boost*
  2. Das längste Muster -- boost* wird über b*
  3. First match - The first registry declaring the best pattern is chosen

Beispiel Nr. 1: Paketnamenauflösung

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"
}

Bei dieser Konfiguration wird jeder Paketname in Folgendes aufgelöst:

  • beicode: aus der Registrierung https://github.com/vicroms/vcpkg-registry (genaue Übereinstimmung bei beicode)
  • beison: aus der Registrierung https://github.com/Microsoft/vcpkg-docs (Mustervergleich zuerst beison im "registries" Array aktiviert und deklariert)
  • fmt: von der Standardregistrierung (keine Übereinstimmungen)

Da mehrere Registrierungen deklarieren bei*, gibt vcpkg auch eine Warnung aus:

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

Beispiel Nr. 2: Zuweisen mehrerer Muster zur Standardregistrierung

Sie können die Standardregistrierung auf zwei Arten ändern. Definieren Sie zunächst Folgendes "default-registry":

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
  }
}

Zweitens durch Festlegen des "default-registry" null Musters auf und Verwenden des "*" "registries" Musters im Array:

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*"]
    }
  ]
}

Ein Vorteil des zweiten Formulars besteht darin, dass Sie dem Paketarray weitere Einträge hinzufügen können, während das "default-registry" Objekt überhaupt kein Paketarray definieren kann. Dieser Unterschied wird in Fällen wichtig, in denen Sie sicherstellen müssen, dass ein Paket aus der Standardregistrierung stammt.

Betrachten wir eine Registrierung, die die Qt Framework-Bibliotheken bereitstellt.

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*"]
    }
  ]
}

Und die folgenden Projektabhängigkeiten:

vcpkg.json

{
  "dependencies": [
    "qt5",
    "qt-advanced-docking-system",
    "qtkeychain"
  ]
}

Das "qt*" Muster entspricht allen Portnamen in vcpkg.json. Aber es gibt ein Problem! Die Ports qt-advanced-docking-system sind qtkeychain nicht Teil der offiziellen Qt Framework-Bibliotheken und da vcpkg die Ports in der benutzerdefinierten Registrierung nicht finden kann, schlägt die Installation fehl.

Dies kann behoben werden, indem sie diese Pakete stattdessen der Standardregistrierung zuweisen. Wir erreichen dies, indem wir die Art und Weise ändern, wie wir die Standardregistrierung deklarieren und zu seinem "packages" Array hinzufügen qt-advanced-docking-system und qtkeychain hinzufügen:

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*"]
    }
  ]
}

Da genaue Übereinstimmungen gegenüber Musterüberstimmungen bevorzugt werden und qt-advanced-docking-system qtkeychain in die Standardregistrierung aufgelöst werden.

Überlagerungsports

Überlagerungsports sind eine Möglichkeit, vcpkg mit zusätzlichen Ports zu erweitern, ohne eine vollständige Registrierung zu erstellen. Überlagerungen werden vor registrierungsbasierten Nachschlagevorgängen oder Versionsverwaltungsaspekten berücksichtigt. Überlagerungen ersetzen alle integrierten Triplets oder Ports. Weitere Informationen finden Sie unter Überlagerungsports .

Überlagerungsports werden in dieser Reihenfolge ausgewertet:

  1. Überlagerungen aus der Befehlszeile --overlay-ports in der übergebenen Reihenfolge.
  2. Überlagerungen von vcpkg-configuration.json"overlay-ports" in der Reihenfolge; dann
  3. Überlagerungen aus der VCPKG_OVERLAY_PORTS Umgebungsvariablen in der Reihenfolge.

Überlagerungs-Triplets

Overlay-Triplets sind eine Möglichkeit, vcpkg mit zusätzlichen Triplets zu erweitern, ohne das Installationsverzeichnis von vcpkg zu ändern. Überlagerungen werden vor integrierten Triplets berücksichtigt.

Overlay-Triplets werden in dieser Reihenfolge ausgewertet:

  1. Überlagerungen aus der Befehlszeile in der übergebenen Reihenfolge.
  2. Überlagerungen von vcpkg-configuration.json schrittweise; dann
  3. Überlagerungen aus der VCPKG_OVERLAY_TRIPLETS Umgebungsvariablen in der Reihenfolge.