Esercitazione: Installare una versione specifica di un pacchetto
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
La baseline di versione stabilisce una versione minima per tutti i pacchetti. Per informazioni sulle linee di base, leggere i concetti vcpkg.
Per ottenere le versioni esatte usate nel passaggio precedente, modificare il contenuto di vcpkg.json
in:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
L'impostazione di builtin-baseline
su un commit SHA specifico del repository vcpkg indica a vcpkg 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 dovrebbe 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 comando x-update-baseline
modifica il file manifesto per impostare builtin-baseline
sul commit Git corrente dell'istanza vcpkg.
È possibile usare l'opzione --add-initial-baseline
per aggiungere un builtin-baseline
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 sopra utilizza la notazione dell'oggetto di 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 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. Nota come zlib
riceve la sua versione di base 1.2.11
.
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 contenuto del vcpkg.json
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, l'impostazione di base 3426db05b996481ca31e95fff3734cf23e0f51bc
aggiunge un vincolo di versione minima per zlib
di 1.2.11
, ma l'istruzione di override forza la versione 1.2.8
.
Compilare ed eseguire il progetto, sostituire %VCPKG_ROOT%
con il percorso di installazione 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 saperne di più su come vcpkg gestisce la risoluzione delle versioni, leggi i concetti di versione e il 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