Tutoriel : Installer une version spécifique d’un package
Important
Cette fonctionnalité est disponible uniquement en mode manifeste.
vcpkg vous permet de contrôler les versions précises de chaque dépendance dans votre projet.
Ce didacticiel vous apprendra à effectuer les opérations suivantes :
Prérequis
- Un terminal
- Éditeur de code
- vcpkg
- CMake
1 - Créer un projet avec un manifeste
Dans un dossier vide, créez les fichiers projet suivants :
Un fichier source (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 fichier projet 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)
Manifeste vcpkg (vcpkg.json
) :
{
"dependencies": [ "fmt", "zlib" ]
}
Générez le projet, remplacez %VCPKG_ROOT%
par votre chemin d’installation vcpkg :
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
Exécutez le programme :
fmt version is 70103
zlib version is 1.2.11
Il est probable que lorsque vous exécutez le programme, les versions de ces bibliothèques sont différentes de la sortie ci-dessus. À l’étape suivante, nous vous montrons comment verrouiller les versions de ces dépendances afin qu’elles restent cohérentes chaque fois que vous générez le projet.
2 - Ajouter des contraintes de version à l’aide d’une base de référence
Une base de référence de version établit un étage de version minimal pour tous les packages. Lisez les concepts vcpkg pour en savoir plus sur les bases de référence.
Pour obtenir les versions exactes utilisées à l’étape précédente, modifiez le contenu de vcpkg.json
:
{
"dependencies": [
"fmt",
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
La définition builtin-baseline
d’une sha de validation spécifique du référentiel vcpkg indique à vcpkg d’utiliser les versions de package à cette validation spécifique comme version minimale pour tous les packages.
Vous pouvez utiliser Git pour examiner les versions de cette base de référence particulière :
git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3
La sortie doit être semblable à ce qui suit :
"fmt": {
"baseline": "7.1.3",
"port-version": 1
},
--
"zlib": {
"baseline": "1.2.11",
"port-version": 9
},
3 - Mettre à jour les versions de référence
Les bases de référence offrent un mécanisme pratique pour mettre à jour les versions de toutes vos dépendances en même temps. Pour mettre à jour votre base de référence, exécutez la commande suivante :
vcpkg x-update-baseline
La x-update-baseline
commande modifie votre fichier manifeste pour définir builtin-baseline
la validation Git actuelle de votre instance vcpkg.
Vous pouvez utiliser l’option --add-initial-baseline
permettant d’ajouter un builtin-baseline
manifeste qui n’en a pas encore.
4 - Ajouter une contrainte de version minimale
Les bases de référence ne sont pas la seule façon de verrouiller la version d’un package. vcpkg accepte également les contraintes de version minimales sous la forme .version>=
Modifiez le contenu de vcpkg.json
:
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}
Le fichier manifeste ci-dessus utilise la notation de l’objet de dépendance pour définir une contrainte de version minimale (version>=
) sur fmt
. Pour satisfaire les dépendances vcpkg doit satisfaire à deux contraintes, l’une provenant de la base de référence et l’autre provenant de la contrainte de version minimale dans la dependencies
liste.
- Contrainte de base de référence,
"version>=": "7.1.3"
. - Contrainte de liste de dépendances,
"version>=": "10.1.1"
.
Générez et exécutez le projet, remplacez %VCPKG_ROOT%
par votre chemin d’installation vcpkg :
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
La sortie doit ressembler à ceci :
fmt version is 100100
zlib version is 1.2.11
Dans ce cas, la version 10.1.1
de fmt
satisfait aux deux contraintes. Notez comment zlib
obtient sa version 1.2.11
de base de référence .
5 - Forcer une version spécifique
Dans certains cas, vous pouvez forcer une version spécifique d’un package, par exemple :
- Pour résoudre les conflits de version.
- Pour verrouiller les versions antérieures à la base de référence.
- Pour verrouiller les versions qui sont sinon incomparables, par exemple :
vista
,xp
.
vcpkg vous permet de résoudre ces problèmes à l’aide de remplacements de version.
Modifiez le vcpkg.json
contenu pour :
{
"dependencies": [
{
"name": "fmt",
"version>=": "10.1.1"
},
"zlib"
],
"builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc",
"overrides": [
{
"name": "zlib",
"version": "1.2.8"
}
]
}
Tout package inclus dans la "overrides"
liste utilise la version spécifiée tout en ignorant toutes les autres contraintes de version. Dans cet exemple, la base de référence 3426db05b996481ca31e95fff3734cf23e0f51bc
ajoute une contrainte de version minimale sur zlib
laquelle 1.2.11
la déclaration de remplacement force la version 1.2.8
à la place.
Générez et exécutez le projet, remplacez %VCPKG_ROOT%
par votre chemin d’installation vcpkg :
rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main
La sortie doit ressembler à ceci :
fmt version is 100100
zlib version is 1.2.8
Étapes suivantes
Dans ce tutoriel, vous avez appris les différents mécanismes que vcpkg propose pour verrouiller des versions de package spécifiques. Lisez les concepts et références de contrôle de version pour en savoir plus sur la façon dont vcpkg gère la résolution de version.
Voici quelques tâches supplémentaires à essayer ensuite :
- Réutiliser des fichiers binaires dans les exécutions d’intégration continue à l’aide de la mise en cache binaire
- Gérer vos bibliothèques privées à l’aide de registres personnalisés