Esercitazione: Installare una versione specifica di un pacchetto
Importante
Questa funzionalità è disponibile solo in modalità manifesto.
vcpkg consente di controllare le versioni precise di ogni dipendenza nel progetto.
In questa esercitazione si apprenderà come:
Prerequisiti
- Un terminale
- Editor di codice
- vcpkg
- CMake
1 - Creare un progetto con un manifesto
In una cartella vuota creare i file di progetto seguenti:
Un file di origine (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;
}
Un file di progetto CMake (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)
Un manifesto vcpkg (vcpkg.json
):
{
"dependencies": [ "fmt", "zlib" ]
}
Compilare il progetto, sostituire %VCPKG_ROOT%
con il percorso di installazione di vcpkg:
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Eseguire il programma:
fmt version is 70103
zlib version is 1.2.11
È probabile che quando si esegue il programma le versioni di queste librerie siano diverse dall'output precedente. Nel passaggio successivo viene illustrato come bloccare le versioni di queste dipendenze in modo che rimangano coerenti ogni volta che si compila il progetto.
2 - Aggiungere vincoli di versione usando una linea di base
Una linea di base della versione stabilisce un piano di versione minimo per tutti i pacchetti. Leggere i concetti relativi a vcpkg per informazioni sulle baseline.
Per ottenere le versioni esatte usate nel passaggio precedente, modificare il contenuto di vcpkg.json
in:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Se si imposta builtin-baseline
su un commit SHA specifico del repository vcpkg, vcpkg viene indicato di usare le versioni del pacchetto con tale commit specifico come versione minima per tutti i pacchetti.
È possibile usare Git per esaminare le versioni per la baseline specifica:
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
L'output deve essere simile al seguente:
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 - Aggiornare le versioni di base
Le baseline offrono un meccanismo pratico per aggiornare le versioni di tutte le dipendenze contemporaneamente. Per aggiornare la baseline, eseguire il comando seguente:
vcpkg x-update-baseline
Il x-update-baseline
comando modifica il file manifesto per impostare builtin-baseline
il commit Git corrente dell'istanza vcpkg.
È possibile usare l'opzione --add-initial-baseline
per aggiungere un builtin-baseline
oggetto a un manifesto che non ne ha ancora uno.
4 - Aggiungere un vincolo di versione minima
Le linee di base non sono l'unico modo per bloccare la versione di un pacchetto. vcpkg accetta anche vincoli di versione minimi sotto forma di version>=
.
Modificare il contenuto di vcpkg.json
in:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Il file manifesto precedente usa la notazione dell'oggetto dipendenza per impostare un vincolo di versione minima (version>=
) su fmt
. Per soddisfare le dipendenze vcpkg deve soddisfare due vincoli, uno proveniente dalla linea di base e uno proveniente dal vincolo di versione minima nell'elenco dependencies
.
- Vincolo di base,
"version>=": "7.1.3"
. - Vincolo elenco dipendenze,
"version>=": "10.1.1"
.
Compilare ed eseguire il progetto, sostituire %VCPKG_ROOT%
con il percorso di installazione di vcpkg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
L'output dovrebbe essere simile al seguente:
fmt version is 100100
zlib version is 1.2.11
In questo caso, la versione 10.1.1
di fmt
soddisfa entrambi i vincoli. Si noti come zlib
ottiene la versione 1.2.11
di base .
5 - Forzare una versione specifica
In alcuni casi, è possibile forzare una versione specifica di un pacchetto, ad esempio:
- Per risolvere i conflitti di versione.
- Per bloccare le versioni precedenti alla baseline.
- Per bloccare le versioni altrimenti incomparabili, ad esempio :
vista
,xp
.
vcpkg consente di risolvere questi problemi usando gli override della versione.
Modificare il vcpkg.json
contenuto in:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Qualsiasi pacchetto incluso nell'elenco "overrides"
userà la versione specificata ignorando tutti gli altri vincoli di versione. In questo esempio, la linea di base 3426db05b996481ca31e95fff3734cf23e0f51bc
aggiunge un vincolo di versione minima su zlib
, ma la dichiarazione di 1.2.11
override forza invece la versione 1.2.8
.
Compilare ed eseguire il progetto, sostituire %VCPKG_ROOT%
con il percorso di installazione di vcpkg:
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
L'output dovrebbe essere simile al seguente:
fmt version is 100100
zlib version is 1.2.8
Passaggi successivi
In questa esercitazione sono stati appresi i diversi meccanismi offerti da vcpkg per bloccare versioni di pacchetti specifiche. Per altre informazioni su come vcpkg gestisce la risoluzione delle versioni, leggere i concetti relativi al controllo delle versioni e informazioni di riferimento.
Ecco alcune attività aggiuntive da provare:
- Riutilizzare i file binari nelle esecuzioni di integrazione continua usando la memorizzazione nella cache binaria
- Gestire le librerie private usando registri personalizzati