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; Andernfalls
  • 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/northwindtraders/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "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/northwindtraders/vcpkg-registry (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/northwindtraders/vcpkg-registry
    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-systemqtkeychain in die Standardregistrierung aufgelöst werden.

Überlagerungen

Überlagerungen sind eine Möglichkeit, vcpkg mit zusätzlichen Ports und zusätzlichen Triplets zu erweitern, ohne eine vollständige Registrierung zu erstellen. Überlagerungen werden berücksichtigt, bevor Sie Registrierungssuchen oder Versionsverwaltungen durchführen und alle integrierten Triplets oder Ports ersetzen. Weitere Informationen finden Sie in der Dokumentation zu Überlagerungen.

Überlagerungseinstellungen werden in dieser Reihenfolge ausgewertet:

  1. Überlagerungen aus der Befehlszeile in der übergebenen Reihenfolge.
  2. Überlagerungen von vcpkg-configuration.json in Der Reihenfolge; Dann
  3. Überlagerungen aus den VCPKG_OVERLAY_[PORTS|TRIPLETS]Umgebungsvariablen in der reihenfolge.