Freigeben über


Lernprogramm: Installieren einer bestimmten Version eines Pakets

Wichtig

Dieses Feature ist nur im Manifestmodus verfügbar.

Mit vcpkg können Sie die genauen Versionen jeder Abhängigkeit in Ihrem Projekt steuern.

In diesem Tutorial lernen Sie Folgendes:

Voraussetzungen

  • Ein Terminal
  • Ein Code-Editor
  • vcpkg
  • CMake

1 – Erstellen eines Projekts mit einem Manifest

Erstellen Sie in einem leeren Ordner die folgenden Projektdateien:

Eine Quelldatei (main.cpp):

#include <fmt/core.h>
#include <zlib.h>

int main()
{
    fmt::print("fmt version is {}\n"
               "zlib version is {}\n", 
               FMT_VERSION, ZLIB_VERSION);
    return 0;
}

Eine CMake-Projektdatei (CMakeLists.txt):

cmake_minimum_required(VERSION 3.18)

project(versionstest CXX)

add_executable(main main.cpp)

find_package(ZLIB REQUIRED)
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE ZLIB::ZLIB fmt::fmt)

Ein vcpkg-Manifest (vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

Erstellen Sie das Projekt, ersetzen Sie es durch %VCPKG_ROOT% Ihren vcpkg-Installationspfad:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build

Führen Sie das Programm aus:

fmt version is 70103
zlib version is 1.2.11

Es ist wahrscheinlich, dass sich die Versionen dieser Bibliotheken beim Ausführen des Programms von der obigen Ausgabe unterscheiden. Im nächsten Schritt zeigen wir Ihnen, wie Sie die Versionen dieser Abhängigkeiten sperren, damit sie jedes Mal konsistent bleiben, wenn Sie das Projekt erstellen.

2 – Hinzufügen von Versionsbeschränkungen mithilfe eines Basisplans

Eine Versionsbasislinie richtet eine Mindestversionsgrenze für alle Pakete ein. Lesen Sie die vcpkg-Konzepte , um mehr über Basispläne zu erfahren.

Um die genauen Versionen abzurufen, die im vorherigen Schritt verwendet werden, ändern Sie den Inhalt in vcpkg.json :

{
  "dependencies": [
    "fmt",
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

Die Einstellung builtin-baseline auf eine bestimmte Commit-SHA des vcpkg-Repositorys weist vcpkg an, die Paketversionen für diesen spezifischen Commit als Mindestversion für alle Pakete zu verwenden.

Sie können Git verwenden, um die Versionen für diesen bestimmten Basisplan zu untersuchen:

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

Die Ausgabe sollte in etwa wie folgt aussehen:

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3 – Aktualisieren der Basisversionen

Basispläne bieten einen bequemen Mechanismus zum Gleichzeitigen Aktualisieren der Versionen aller Abhängigkeiten. Führen Sie den folgenden Befehl aus, um den Basisplan zu aktualisieren:

vcpkg x-update-baseline

Mit dem x-update-baseline Befehl wird Ihre Manifestdatei so geändert, dass sie auf den aktuellen Git-Commit Ihrer vcpkg-Instanz festgelegt builtin-baseline wird.

Sie können die --add-initial-baseline Option verwenden, um einem Manifest, das noch nicht vorhanden ist, ein builtin-baseline Manifest hinzuzufügen.

4 – Hinzufügen einer Mindestversionseinschränkung

Basispläne sind nicht die einzige Möglichkeit, die Version eines Pakets zu sperren. vcpkg akzeptiert auch Mindestversionseinschränkungen in Form von version>=.

Ändern sie den Inhalt von vcpkg.json in:

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

In der obigen Manifestdatei wird die Abhängigkeitsobjektnotation verwendet, um eine Mindestversionseinschränkung (version>=) festzulegen fmt. Um die Abhängigkeiten zu erfüllen, muss vcpkg zwei Einschränkungen erfüllen, eine aus dem Basisplan und eine, die aus der Mindestversionseinschränkung in der dependencies Liste stammt.

  • Baseline constraint, "version>=": "7.1.3".
  • Abhängigkeitslisteneinschränkung, "version>=": "10.1.1".

Erstellen Sie das Projekt, und führen Sie es aus, ersetzen Sie %VCPKG_ROOT% den vcpkg-Installationspfad:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

Die Ausgabe sollte wie folgt aussehen:

fmt version is 100100
zlib version is 1.2.11

In diesem Fall erfüllt version 10.1.1 of fmt both constraints. Beachten Sie, wie zlib die Basisversion 1.2.11erhalten wird.

5 – Erzwingen einer bestimmten Version

In einigen Fällen möchten Sie möglicherweise eine bestimmte Version eines Pakets erzwingen, z. B.:

  • So lösen Sie Versionskonflikte.
  • So sperren Sie Versionen, die älter als der Basisplan sind.
  • Um Versionen zu sperren, die andernfalls unvergleichlich sind, z. B.: vista, xp.

Mit vcpkg können Sie diese Probleme mithilfe von Versionsüberschreibungen lösen.

Ändern Sie den vcpkg.json Inhalt in:

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
  "overrides": [
    { 
        "name": "zlib", 
        "version": "1.2.8"
    }
  ]
}

Jedes in der "overrides" Liste enthaltene Paket verwendet die angegebene Version, während alle anderen Versionsbeschränkungen ignoriert werden. In diesem Beispiel fügt die Basislinie 3426db05b996481ca31e95fff3734cf23e0f51bc eine Mindestversionseinschränkung 1.2.11zlib hinzu, aber stattdessen erzwingt die Außerkraftsetzung der Deklaration die Version1.2.8.

Erstellen Sie das Projekt, und führen Sie es aus, ersetzen Sie %VCPKG_ROOT% den vcpkg-Installationspfad:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

Die Ausgabe sollte wie folgt aussehen:

fmt version is 100100
zlib version is 1.2.8

Nächste Schritte

In diesem Lernprogramm haben Sie die verschiedenen Mechanismen kennengelernt, die vcpkg zum Sperren bestimmter Paketversionen bietet. Lesen Sie die Versionsverwaltungskonzepte und referenzieren Sie, um mehr darüber zu erfahren, wie vcpkg die Versionsauflösung behandelt.

Hier sind einige zusätzliche Aufgaben, die Sie als Nächstes ausprobieren können: