Condividi tramite


Esercitazione: Installare una versione specifica di un pacchetto

Importante

Questa funzionalità è disponibile solo in modalità manifest .

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