Självstudie: Installera en specifik version av ett paket
Viktig
Den här funktionen är endast tillgänglig i manifestläge.
Med vcpkg kan du styra de exakta versionerna av varje beroende i projektet.
I den här handledningen lär du dig:
Förutsättningar
- En terminal
- En kodredigerare
- vcpkg
- CMake
1 – Skapa ett projekt med ett manifest
Skapa följande projektfiler i en tom mapp:
En källfil (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;
}
En CMake-projektfil (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)
Ett vcpkg-manifest (vcpkg.json
):
{
"dependencies": [ "fmt", "zlib" ]
}
Skapa projektet, ersätt %VCPKG_ROOT%
med installationssökvägen för vcpkg:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Kör programmet:
fmt version is 70103
zlib version is 1.2.11
Det är troligt att när du kör programmet skiljer sig versionerna av dessa bibliotek från utdata ovan. I nästa steg visar vi hur du låser versionerna av dessa beroenden så att de förblir konsekventa varje gång du skapar projektet.
2 – Lägg till versionsbegränsningar med hjälp av en baslinje
En versionsbaslinje, upprättar ett lägsta versionsgolv för alla paket. Läs vcpkg-begreppen för att lära dig mer om baslinjer.
Om du vill hämta de exakta versioner som användes i föregående steg ändrar du innehållet i vcpkg.json
till:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Om du anger builtin-baseline
till en specifik inchecknings-SHA för vcpkg-lagringsplatsen instrueras vcpkg att använda paketversionerna vid den specifika incheckningen som lägsta version för alla paket.
Du kan använda Git för att undersöka versionerna för den specifika baslinjen:
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
Utdata bör se ut ungefär så här:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 – Uppdatera baslinjeversionerna
Baslinjer erbjuder en praktisk mekanism för att uppdatera versionerna av alla dina beroenden samtidigt. Om du vill uppdatera baslinjen kör du följande kommando:
vcpkg x-update-baseline
Kommandot x-update-baseline
ändrar manifestfilen för att ange builtin-baseline
till den aktuella Git-incheckningen för din vcpkg-instans.
Du kan använda alternativet --add-initial-baseline
för att lägga till en builtin-baseline
i ett manifest som inte har något ännu.
4 – Lägg till en lägsta versionsvillkor
Baslinjer är inte det enda sättet att låsa ett pakets version. vcpkg accepterar också lägsta versionsbegränsningar i form av version>=
.
Ändra innehållet i vcpkg.json
till:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Manifestfilen ovan använder beroendeobjektet notation för att ange en lägsta versionsbegränsning (version>=
) på fmt
. För att uppfylla beroendena måste vcpkg uppfylla två begränsningar, en som kommer från baslinjen och en som kommer från den lägsta versionsbegränsningen i dependencies
-listan.
- Baslinjebegränsning,
"version>=": "7.1.3"
. - Listbegränsning av beroenden,
"version>=": "10.1.1"
.
Skapa och kör projektet, ersätt %VCPKG_ROOT%
med din vcpkg-installationssökväg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Utdata bör se ut så här:
fmt version is 100100
zlib version is 1.2.11
I det här fallet uppfyller version 10.1.1
av fmt
båda begränsningarna. Observera hur zlib
hämtar sin baslinjeversion 1.2.11
.
5 – Framtvinga en specifik version
I vissa fall kanske du vill framtvinga en specifik version av ett paket, till exempel:
- Så här löser du versionskonflikter.
- Så här låser du versioner som är äldre än baslinjen.
- Om du vill låsa versioner som annars är ojämförliga, till exempel:
vista
,xp
.
Med vcpkg kan du lösa dessa problem med hjälp av versionsöverskrivningar.
Ändra innehållet i vcpkg.json
till:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Alla paket som ingår i "overrides"
-listan använder den angivna versionen samtidigt som alla andra versionsbegränsningar ignoreras. I det här exemplet lägger baslinjen 3426db05b996481ca31e95fff3734cf23e0f51bc
till en lägsta versionsbegränsning för zlib
av 1.2.11
, men åsidosättningsdeklarationen tvingar version 1.2.8
i stället.
Skapa och kör projektet, ersätt %VCPKG_ROOT%
med din vcpkg-installationssökväg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
Utdata bör se ut så här:
fmt version is 100100
zlib version is 1.2.8
Nästa steg
I den här självstudien har du lärt dig de olika mekanismer som vcpkg erbjuder för att låsa specifika paketversioner. Läs versionsbegreppen och referens om du vill veta mer om hur vcpkg hanterar versionsmatchning.
Här följer några ytterligare uppgifter att prova härnäst:
- Återanvänd binärfiler över kontinuerliga integrationskörningar med binär cache
- Hantera dina privata bibliotek med hjälp av anpassade register