Lernprogramm: Installieren einer bestimmten Version eines Pakets
Wichtig
Dieses Feature ist nur im Manifestmodusverfügbar.
Mit vcpkg können Sie die genauen Versionen jeder Abhängigkeit in Ihrem Projekt steuern.
In diesem Lernprogramm lernen Sie Folgendes:
Voraussetzungen
- Ein Terminal
- Programm-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 %VCPKG_ROOT%
durch 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 von vcpkg.json
in:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Wenn Sie builtin-baseline
auf einen bestimmten Commit-SHA des vcpkg-Repositorys festlegen, wird vcpkg angewiesen, die Paketversionen bei diesem bestimmten 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 etwa wie folgt aussehen:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 – Aktualisieren der Basisversionen
Basislinien bieten einen einfachen Mechanismus zum gleichzeitigen Aktualisieren der Versionen all Ihrer Abhängigkeiten. Führen Sie den folgenden Befehl aus, um den Basisplan zu aktualisieren:
vcpkg x-update-baseline
Der Befehl x-update-baseline
ändert Ihre Manifestdatei so, dass builtin-baseline
auf den aktuellen Git-Commit Ihrer vcpkg-Instanz festgelegt wird.
Sie können die Option --add-initial-baseline
verwenden, um einem Manifest, das noch keine builtin-baseline
hat, eine hinzuzufügen.
4 – Hinzufügen einer Mindestversionseinschränkung
Baselines sind nicht die einzige Möglichkeit, die Version eines Pakets festzusetzen. 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ängigkeitsobjekt--Notation verwendet, um eine Mindestversionseinschränkung (version>=
) für fmt
festzulegen. 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 liste dependencies
stammt.
- Baseline-Einschränkung,
"version>=": "7.1.3"
. - Abhängigkeitslisten-Einschränkung,
"version>=": "10.1.1"
.
Erstellen Sie das Projekt, führen Sie es aus und ersetzen Sie %VCPKG_ROOT%
durch Ihren 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
von fmt
beide Einschränkungen. Beachten Sie, wie zlib
seine Basisversion 1.2.11
erhält.
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.
- Um Versionen, die älter als die Basisversion sind, zu sperren.
- 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 Inhalt von vcpkg.json
zu:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Jedes paket, das in der liste "overrides"
enthalten ist, verwendet die angegebene Version, während alle anderen Versionsbeschränkungen ignoriert werden. In diesem Beispiel fügt die Baseline 3426db05b996481ca31e95fff3734cf23e0f51bc
für zlib
eine Einschränkung für mindestens Version 1.2.11
hinzu, aber die Außerkraftsetzungsdeklaration erzwingt stattdessen die Version 1.2.8
.
Erstellen Sie das Projekt und führen Sie es aus; ersetzen Sie %VCPKG_ROOT%
durch Ihren 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 Versionierungs-Konzepte und sowie die -Dokumentation, um mehr darüber zu erfahren, wie vcpkg die Auflösung von Versionen durchführt.
Hier sind einige zusätzliche Aufgaben, die Sie als Nächstes ausprobieren können:
- Verwenden Sie bei Continuous Integration-Ausführungen mithilfe der binären Zwischenspeicherung Binärdateien wieder
- Verwalten Ihrer privaten Bibliotheken mithilfe von benutzerdefinierten Registrierungen