Zelfstudie: Een specifieke versie van een pakket installeren
Belangrijk
Deze functie is alleen beschikbaar in manifestmodus.
met vcpkg kunt u de exacte versies van elke afhankelijkheid in uw project beheren.
In deze zelfstudie leert u het volgende:
Voorwaarden
- Een terminal
- Een code-editor
- vcpkg
- CMake
1 - Een project maken met een manifest
Maak in een lege map de volgende projectbestanden:
Een bronbestand (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;
}
Een CMake-projectbestand (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)
Een vcpkg-manifest (vcpkg.json
):
{
"dependencies": [ "fmt", "zlib" ]
}
Bouw het project, vervang %VCPKG_ROOT%
door uw vcpkg-installatiepad:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Voer het programma uit:
fmt version is 70103
zlib version is 1.2.11
Het is waarschijnlijk dat wanneer u het programma uitvoert, de versies van deze bibliotheken anders zijn dan de bovenstaande uitvoer. In de volgende stap laten we u zien hoe u de versies van deze afhankelijkheden kunt vergrendelen, zodat ze consistent blijven telkens wanneer u het project bouwt.
2 - Versiebeperkingen toevoegen met behulp van een basislijn
Met een versiebasislijn wordt een minimale versievloer voor alle pakketten vastgesteld. Lees de vcpkg-concepten voor meer informatie over basislijnen.
Als u de exacte versies wilt ophalen die in de vorige stap zijn gebruikt, wijzigt u de inhoud van vcpkg.json
in:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Als u builtin-baseline
instelt op een specifieke doorvoer-SHA van de vcpkg-opslagplaats, wordt vcpkg geïnstrueerd om de pakketversies bij die specifieke doorvoering te gebruiken als de minimale versie voor alle pakketten.
U kunt Git gebruiken om de versies voor die specifieke basislijn te onderzoeken:
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
De uitvoer moet er ongeveer als volgt uitzien:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 - De basislijnversies bijwerken
Baselines bieden een handig mechanisme om de versies van al uw afhankelijkheden op één moment bij te werken. Voer de volgende opdracht uit om uw basislijn bij te werken:
vcpkg x-update-baseline
Met de opdracht x-update-baseline
wijzigt u het manifestbestand om builtin-baseline
in te stellen op de huidige Git-doorvoering van uw vcpkg-exemplaar.
U kunt de optie --add-initial-baseline
gebruiken om een builtin-baseline
toe te voegen aan een manifest dat er nog geen heeft.
4 - Een minimale versiebeperking toevoegen
Basisversies zijn niet de enige manier om de versie van een pakket vast te zetten. vcpkg accepteert ook minimale versiebeperkingen in de vorm van version>=
.
Wijzig de inhoud van vcpkg.json
in:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
In het bovenstaande manifestbestand wordt het afhankelijkheidsobject notatie gebruikt om een minimale versiebeperking (version>=
) in te stellen op fmt
. Om aan de afhankelijkheden te voldoen, moet vcpkg aan twee beperkingen voldoen: één afkomstig van de basislijn en één afkomstig van de minimale versie-eis in de dependencies
lijst.
- Basislijnbeperking,
"version>=": "7.1.3"
. - Beperking van de afhankelijkhedenlijst,
"version>=": "10.1.1"
.
Bouw het project en voer het uit, vervang %VCPKG_ROOT%
door uw vcpkg-installatiepad:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
De uitvoer moet er als volgt uitzien:
fmt version is 100100
zlib version is 1.2.11
In dit geval voldoet versie 10.1.1
van fmt
aan beide beperkingen. Let op hoe zlib
zijn basislijnversie 1.2.11
krijgt.
5 - Een specifieke versie afdwingen
In sommige gevallen wilt u mogelijk een specifieke versie van een pakket afdwingen, bijvoorbeeld:
- Versieconflicten oplossen.
- Versies die ouder zijn dan de basislijn vergrendelen.
- Als u versies wilt vergrendelen die anders ongelijkbaar zijn, bijvoorbeeld:
vista
,xp
.
Met vcpkg kunt u deze problemen oplossen door versieoverschrijvingen te gebruiken.
Wijzig de inhoud van vcpkg.json
in:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Elk pakket dat is opgenomen in de "overrides"
lijst, gebruikt de opgegeven versie en negeert alle andere versiebeperkingen. In dit voorbeeld voegt de basislijn 3426db05b996481ca31e95fff3734cf23e0f51bc
een minimum versiebeperking toe aan zlib
van 1.2.11
, maar de overschrijvingsverklaring dwingt in plaats daarvan versie 1.2.8
af.
Bouw het project en voer het uit, vervang %VCPKG_ROOT%
door uw vcpkg-installatiepad:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
De uitvoer moet er als volgt uitzien:
fmt version is 100100
zlib version is 1.2.8
Volgende stappen
In deze zelfstudie hebt u de verschillende mechanismen geleerd die vcpkg biedt om specifieke pakketversies te vergrendelen. Lees de concepten voor versiebeheer en, en de referentie en om meer te weten te komen over hoe vcpkg versieoplossing verwerkt.
Hier volgen enkele extra taken om het volgende te proberen:
- Binaire bestanden in continue integratie opnieuw gebruiken met binaire caching
- Uw persoonlijke bibliotheken beheren met aangepaste registers