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.11
erhalten 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.11
zlib
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:
- Wiederverwenden von Binärdateien in fortlaufender Integration mithilfe der binären Zwischenspeicherung
- Verwalten Ihrer privaten Bibliotheken mithilfe benutzerdefinierter Registrierungen