Partage via


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.

Dans ce tutoriel, vous allez apprendre à :

Conditions préalables

  • 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)

Un 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 pour :

{
  "dependencies": [
    "fmt",
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

Définir builtin-baseline sur un SHA de commit spécifique du référentiel vcpkg indique à vcpkg d’utiliser les versions de package à ce commit 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 ressembler à ceci :

    "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 commande x-update-baseline modifie votre fichier manifeste pour définir builtin-baseline sur la validation Git actuelle de votre instance vcpkg.

Vous pouvez utiliser l’option --add-initial-baseline pour ajouter un builtin-baseline à un manifeste qui n’en a pas encore.

4 - Ajouter une contrainte de version minimale

Les lignes de base ne sont pas le seul moyen de verrouiller la version d’un package. vcpkg accepte également les contraintes de version minimales sous la forme de version>=.

Modifiez le contenu de vcpkg.json pour :

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc"
}

Le fichier manifeste ci-dessus utilise l’objet de dépendance notation 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 liste dependencies.

  • Contrainte de la ligne de base, "version>=": "7.1.3".
  • Contrainte de la liste des 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 de référence 1.2.11.

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 autrement seraient incomparables, par exemple : vista, xp.

vcpkg vous permet de résoudre ces problèmes à l’aide de remplacements de version.

Remplacez le contenu vcpkg.json par :

{
  "dependencies": [
    {
        "name": "fmt",
        "version>=": "10.1.1"
    },
    "zlib"
  ],
  "builtin-baseline": "3426db05b996481ca31e95fff3734cf23e0f51bc", 
  "overrides": [
    { 
        "name": "zlib", 
        "version": "1.2.8"
    }
  ]
}

Tout package inclus dans la liste "overrides" 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 pour zlib à 1.2.11, mais la déclaration de substitution 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. Consultez les concepts et références relatifs au 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érez vos bibliothèques privées à l’aide de registres personnalisés