Erste Schritte mit der Versionsverwaltung
Verwenden von Versionen mit Manifesten
Beginnen wir mit dem Erstellen eines einfachen CMake-Projekts, das von fmt
und .zlib
Erstellen Sie einen Ordner mit den folgenden Dateien:
vcpkg.json
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
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;
}
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)
Und jetzt erstellen und führen wir unser Projekt mit CMake aus:
Erstellen Sie das Buildverzeichnis für das Projekt.
PS D:\versions-test> mkdir build PS D:\versions-test> cd build
Konfigurieren Sie CMake.
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake .. -- Running vcpkg install Detecting compiler hash for triplet x86-windows... The following packages will be built and installed: fmt[core]:x64-windows -> 7.1.3#1 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72 vcpkg-cmake[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake\51896aa8073adb5c8450daa423d03eedf0dfc61f vcpkg-cmake-config[core]:x64-windows -> 2021-02-26 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\vcpkg-cmake-config\d255b3d566a8861dcc99a958240463e678528066 zlib[core]:x64-windows -> 1.2.11#9 -- D:\Work\viromer\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4 ...
Erstellen Sie das Projekt.
PS D:\versions-test\build> cmake --build . [2/2] Linking CXX executable main.exe
Führen Sie die App aus!
PS D:\versions-test\build> ./main.exe fmt version is 70103 zlib version is 1.2.11
Sehen Sie sich die Ausgabe an:
fmt[core]:x86-windows -> 7.1.3#1 -- D:\vcpkg\buildtrees\versioning\versions\fmt\4f8427eb0bd40da1856d4e67bde39a4fda689d72
...
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
Anstatt die Portdateien in ports/
zu verwenden, überprüft vcpkg die Dateien für jede Version in buildtrees/versioning/versions/
. Die Dateien werden ports/
weiterhin verwendet, wenn vcpkg im klassischen Modus ausgeführt wird.
Hinweis
Die Ausgabe von vcpkg beim Konfigurieren von CMake ist nur verfügbar, wenn Sie die CMake-Version 3.18
oder neuer verwenden. Wenn Sie ein älteres CMake verwenden, können Sie die vcpkg-manifest-install.log
Datei stattdessen in Ihrem Buildverzeichnis überprüfen.
Lesen Sie unseren Blogbeitrag zur Manifestankündigung, um zu erfahren, wie Sie Manifeste mit MSBuild verwenden.
Manifeständerungen
Wenn Sie Manifeste verwendet haben, bevor Sie feststellen, dass es einige neue JSON-Eigenschaften gibt. Sehen wir uns diese Änderungen an:
version
{
"name": "versions-test",
"version": "1.0.0"
}
Dies ist die Versionsdeklaration Ihres Projekts. Bisher konnten Sie nur Versionen für Ihre Projekte mit der version-string
Eigenschaft deklarieren. Da sich die Versionsverwaltung nun befindet, ist vcpkg von einigen neuen Versionsverwaltungsschemas bekannt.
Versionsschema | Beschreibung |
---|---|
version |
Punkttrennte Zahlen: 1.0.0.5 . |
version-semver |
Kompatible semantische Versionen: 1.2.0 und 1.2.0-rc . |
version-date |
Datumsangaben im YYYY-MM-DD Format: 2021-01-01 |
version-string |
Beliebige Zeichenfolgen: vista , candy . |
version>=
{
"dependencies": [
{ "name": "fmt", "version>=": "7.1.3" },
"zlib"
]
}
Diese Eigenschaft wird verwendet, um Mindestversionseinschränkungen auszudrücken, sie ist nur als Teil der "dependencies"
Deklarationen zulässig. In unserem Beispiel legen wir eine explizite Einschränkung für die Version 7.1.3#1
von fmt
.
vcpkg darf diese Einschränkung aktualisieren, wenn eine transitive Abhängigkeit eine neuere Version erfordert. Wenn beispielsweise zlib
eine Abhängigkeit von fmt
der Version 7.1.4
deklariert werden soll, würde vcpkg stattdessen installiert 7.1.4
.
vcpkg verwendet einen Minimalversionsansatz, selbst wenn fmt
die Version 8.0.0
veröffentlicht werden sollte, würde vcpkg weiterhin die Version 7.1.3#1
installieren, da dies die Mindestversion ist, die die Einschränkung erfüllt. Die Vorteile dieses Ansatzes sind, dass Sie keine unerwarteten Abhängigkeitsupgrades erhalten, wenn Sie vcpkg aktualisieren und reproduzierbare Builds (in Bezug auf die verwendete Version) erhalten, solange Sie dasselbe Manifest verwenden.
Wenn Sie ihre Abhängigkeiten aktualisieren möchten, können Sie die Mindestversionseinschränkung stürzen oder einen neueren Basisplan verwenden.
builtin-baseline
{ "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc" }
Dieses Feld deklariert die Versionsverwaltungsbasislinie für alle Ports. Das Festlegen eines Basisplans ist erforderlich, um die Versionsverwaltung zu aktivieren, andernfalls erhalten Sie die aktuellen Versionen im ports/
Verzeichnis. Sie können "git rev-parse HEAD" ausführen, um den aktuellen Commit von vcpkg abzurufen und als integrierten Basisplan festzulegen. Weitere Informationen finden Sie in der "builtin-baseline"
Dokumentation .
In unserem Beispiel deklarieren wir keine Versionsbeschränkung für zlib
; stattdessen wird die Version aus der Basislinie entnommen. Intern sucht vcpkg im Commit 3426db05b996481ca31e95fff3734cf23e0f51bc
, um herauszufinden, welche Version zu zlib
diesem Zeitpunkt die neueste war (in unserem Fall 1.2.11#9
).
Bei der Versionsauflösung werden Basisversionen als Mindestversionseinschränkungen behandelt. Wenn Sie eine explizite Einschränkung deklarieren, die niedriger als eine Basisplanversion ist, wird die explizite Einschränkung auf die Basisversion aktualisiert.
Beispiel: Wenn wir unsere Abhängigkeiten wie folgt geändert haben:
{ "dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
] }
Hinweis
Der Wert 1.2.11#7
stellt Version 1.2.11
, Portversion 7
dar.
Da der Basisplan eine Mindestversionseinschränkung für zlib
at und 1.2.11#9
eine höhere Version die Mindestversionseinschränkung für 1.2.11#7
erfüllt, darf vcpkg sie aktualisieren.
Basispläne sind auch ein praktischer Mechanismus zum gleichzeitigen Upgrade mehrerer Versionen, z. B. wenn Sie von mehreren boost
Bibliotheken abhängen möchten, ist es praktischer, die baseline
einmal festzulegen, als eine Versionsbeschränkung für jedes Paket zu deklarieren.
Aber was geschieht, wenn Sie eine ältere Version als die Basislinie anheften möchten?
overrides
Da Basispläne einen Versionsboden für alle Pakete einrichten und explizite Einschränkungen aktualisiert werden, wenn sie niedriger als der Basisplan sind, benötigen wir einen weiteren Mechanismus zum Herabstufen von Versionen über den Basisplan.
Der Mechanismus vcpkg stellt dieses Szenario bereit.overrides
Wenn eine Außerkraftsetzung für ein Paket deklariert wird, ignoriert vcpkg alle anderen Versionseinschränkungen entweder direkt im Manifest deklariert oder von transitiven Abhängigkeiten. Kurz gesagt overrides
, erzwingt vcpkg die Verwendung der genau deklarierten Version, Punkt.
Lassen Sie uns unser Beispiel noch einmal ändern, dieses Mal, um zu erzwingen, dass vcpkg die Version 6.0.0
von fmt
verwendet.
{
"name": "versions-test",
"version": "1.0.0",
"dependencies": [
{
"name": "fmt",
"version>=": "7.1.3#1"
},
{
"name": "zlib",
"version>=": "1.2.11#7"
}
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "fmt",
"version": "6.0.0"
}
]
}
Erstellen Sie unser Projekt neu:
PS D:\versions-test\build> rm ./CMakeCache.txt
PS D:\versions-test\build> rm -r ./vcpkg_installed
PS D:\versions-test\build> cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake ..
-- Running vcpkg install
Detecting compiler hash for triplet x86-windows...
The following packages will be built and installed:
fmt[core]:x86-windows -> 6.0.0 -- D:\vcpkg\buildtrees\versioning\versions\fmt\d99b6a35e1406ba6b6e09d719bebd086f83ed5f3
zlib[core]:x86-windows -> 1.2.11#9 -- D:\vcpkg\buildtrees\versioning\versions\zlib\827111046e37c98153d9d82bb6fa4183b6d728e4
...
PS D:\versions-test\build> cmake --build .
[2/2] Linking CXX executable main.exe
Und führen Sie es aus!
PS D:\versions-test\build> .\main.exe
fmt version is 60000
zlib version is 1.2.11
Beachten Sie, wie die fmt
Version 6.0.0
jetzt wie gewünscht ist.
Versionen und benutzerdefinierte Ports
Am letzten Punkt wird erläutert, wie Überlagerungsports mit der Versionsverwaltungsauflösung interagieren. Die Antwort lautet: Sie sind nicht.
Wenn Sie eine Überlagerung für einen Port bereitstellen, verwendet vcpkg immer den Overlayport, ohne zu berücksichtigen, welche Version darin enthalten ist. Die Gründe sind zweifaltig: (1) sie ist mit dem vorhandenen Verhalten von Überlagerungsports konsistent, die den vorhandenen Port vollständig maskieren, und (2) Überlagerungsports bieten nicht (und werden nicht erwartet), um genügend Informationen bereitzustellen, um das Versionsverwaltungsfeature von vcpkg zu unterstützen.
Wenn Sie eine flexible Portanpassung zusammen mit der Versionsverwaltung haben möchten, sollten Sie ihre eigene benutzerdefinierte Registrierung erstellen.
Weitere Informationen
Wenn Sie mehr über die Funktionsweise der Versionsverwaltung erfahren möchten, empfehlen wir Ihnen, unsere Versionsverwaltungsreferenz und Versionsverwaltungskonzepte zu lesen.