Versionsverwaltungskonzepte

Mindestversionsverwaltung

vcpkg verwendet einen minimalen Auswahlansatz für die Versionsverwaltung, inspiriert von der von Go verwendeten, aber auf einige Arten geändert:

  • Startet immer mit einer neu installierten Installation, löscht die Notwendigkeit von Upgrade-/Downgrade-Vorgängen.
  • Zulassen von nicht eingeschränkten Abhängigkeiten durch Einführung von Basisplanen.

Das minimale Auswahlprinzip bleibt jedoch gleich. Angesichts einer Reihe von Einschränkungen verwendet vcpkg die "ältesten" möglichen Versionen von Paketen, die alle Einschränkungen erfüllen können.

Die Verwendung eines Mindestversionsansatzes hat die folgenden Vorteile:

  • Es ist vorhersehbar und leicht zu verstehen.
  • Benutzersteuerungen, wenn Upgrades erfolgen, wie in diesem Fall, werden keine Upgrades automatisch ausgeführt, wenn eine neue Version veröffentlicht wird.
  • Vermeiden Sie die Verwendung eines SAT-Solvers.

Um ein Beispiel zu geben, betrachten Sie das folgende Paketdiagramm:

    (A 1.0) -> (B 1.0)

    (A 1.1) -> (B 1.0) 
            -> (C 3.0) 

    (A 1.2) -> (B 2.0)
            -> (C 3.0)

    (C 2.0)

Und das folgende Manifest:

{
    "name": "example",
    "version": "1.0.0",
    "dependencies": [ 
        { "name": "A", "version>=": "1.1" },
        { "name": "C", "version>=": "2.0" }
    ], 
    "builtin-baseline": "<some git commit with A's baseline at 1.0>"
}

Nach der Berechnung transitiver Abhängigkeiten haben wir die folgenden Einschränkungen:

  • A >= 1,1
    • B >= 1,0
    • C >= 3,0
  • C >= 2,0

Da vcpkg alle Einschränkungen erfüllen muss, wird der Satz der installierten Pakete wie folgt:

  • A 1.1, auch wenn A 1.2 vorhanden, gibt es keine Einschränkungen, die höher sind als 1.1 vcpkg wählt die Mindestversion möglich.
  • B 1.0, transitiv erforderlich von A 1.1.
  • C 3.0, aktualisiert durch die transitive Einschränkung, die B 1.0 hinzugefügt wurde, um Versionsbeschränkungen zu erfüllen.

Einschränkungsauflösung

Angesichts eines Manifests mit einer Reihe von versionsbezogenen Abhängigkeiten versucht vcpkg, einen Paketinstallationsplan zu berechnen, der alle Einschränkungen erfüllt.

Versionsbeschränkungen kommen in den folgenden Varianten:

  • Deklarierte Einschränkungen: Einschränkungen, die explizit im Manifest der obersten Ebene mithilfe von version>=.
  • Baseline constraints: Constraints added implicitly by the builtin-baseline.
  • Transitive Einschränkungen: Einschränkungen, die indirekt von Abhängigkeiten Ihrer Abhängigkeiten hinzugefügt werden.
  • Außerkraftsetzungen von Einschränkungen: Einschränkungen werden im Manifest der obersten Ebene mithilfe von overrides Deklarationen überschrieben.

Um einen Installationsplan zu berechnen, führt vcpkg ungefähr die folgenden Schritte aus:

  • Fügen Sie dem Plan alle Einschränkungen auf oberster Ebene hinzu.
  • Fügen Sie dem Plan rekursiv transitive Einschränkungen hinzu.
    • Jedes Mal, wenn dem Plan ein neues Paket hinzugefügt wird, fügen Sie dem Plan auch die geplante Einschränkung hinzu.
    • Jedes Mal, wenn eine Einschränkung hinzugefügt wird:
    • Wenn eine Außerkraftsetzung für das Paket vorhanden ist
      • Wählen Sie die Version in der Außerkraftsetzung aus.
    • Andernfalls:
      • Wenn keine vorherige Version ausgewählt ist.
        • Wählen Sie die minimale Version aus, die der Einschränkung entspricht.
      • Wenn eine frühere Version ausgewählt ist:
        • Wenn das Versionsverwaltungsschema der neuen Einschränkung nicht mit der der zuvor ausgewählten Version übereinstimmt:
          • Fügen Sie einen Versionskonflikt hinzu.
        • Wenn die Version der Einschränkung nicht mit der zuvor ausgewählten Version vergleichbar ist. Vergleichen Sie beispielsweise "version-string: apple" mit "version-string: orange":
          • Fügen Sie einen Versionskonflikt hinzu.
        • Wenn die Einschränkungsversion höher als die zuvor ausgewählte Version ist:
          • Wählen Sie die höchste Version aus.
        • Andernfalls:
          • Behalten Sie die vorherige Auswahl bei.
  • Überprüfen Sie den Plan:
    • Wenn keine Konflikte vorhanden sind
      • Installieren der ausgewählten Pakete
    • Andernfalls:
      • Melden der Konflikte an den Benutzer

Abrufen von Portversionen

Obwohl das Konzept der Paketversionen immer in vcpkg vorhanden war, wurde das Konzept der Versionsbeschränkungen nicht.

Mit der Einführung von Versionsverwaltungseinschränkungen ist es jetzt möglich, dass ein Paket von einer Portversion abhängt, die nicht mit dem lokal verfügbaren übereinstimmt. Dies löst ein Problem aus, da vcpkg wissen muss, wie die Portdateien für die angeforderte Version abgerufen werden.

Um dieses Problem zu beheben, wurde eine neue Gruppe von Metadatendateien eingeführt. Diese Dateien befinden sich im versions/ Verzeichnis auf der Stammebene des vcpkg-Repositorys.

Das versions/ Verzeichnis enthält JSON-Dateien für jeden der ports, die in der Registrierung verfügbar sind. Jede Datei listet alle für ein Paket verfügbaren Versionen auf und enthält ein Git-ish-Objekt, das vcpkg auschecken kann, um die Portdateien dieser Version abzurufen.

Beispiel: zlib.json

{
  "versions": [
    {
      "git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
      "version-string": "1.2.11",
      "port-version": 9
    },
    ...
    {
      "git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
      "version-string": "1.2.10",
      "port-version": 0
    },
    {
      "git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
      "version-string": "1.2.8",
      "port-version": 0
    }
  ]
}

Für jeden Port sollte sich die entsprechende Versionsdatei befinden versions/{first letter of port name}-/{port name}.json. Die Versionsdatei von zlib befindet sich z. B. in versions/z-/zlib.json. Abgesehen von Portversionsdateien befindet sich die aktuelle Basisplandatei in versions/baseline.json.