Compartir a través de


Tutorial: Instalación de una versión específica de un paquete

Importante

Esta característica solo está disponible en modo de manifiesto.

vcpkg permite controlar las versiones precisas de cada dependencia del proyecto.

En este tutorial, aprenderá a:

Requisitos previos

  • Un terminal
  • Editor de código
  • vcpkg
  • CMake

1- Creación de un proyecto con un manifiesto

En una carpeta vacía, cree los siguientes archivos de proyecto:

Un archivo de origen (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 archivo de proyecto de 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 manifiesto vcpkg (vcpkg.json):

{
  "dependencies": [ "fmt", "zlib" ]
}

Compile el proyecto y reemplace por %VCPKG_ROOT% la ruta de instalación de vcpkg:

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build

Ejecute el programa:

fmt version is 70103
zlib version is 1.2.11

Es probable que, al ejecutar el programa, las versiones de estas bibliotecas sean diferentes de la salida anterior. En el paso siguiente, le mostramos cómo bloquear las versiones de estas dependencias para que permanezcan coherentes cada vez que compile el proyecto.

2- Adición de restricciones de versión mediante una línea base

Una línea base de versión establece un piso de versión mínimo para todos los paquetes. Lea los conceptos de vcpkg para obtener información sobre las líneas base.

Para obtener las versiones exactas usadas en el paso anterior, modifique el contenido de vcpkg.json en:

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

Si se establece builtin-baseline en un SHA de confirmación específico del repositorio vcpkg, se indica a vcpkg que use las versiones del paquete en esa confirmación específica como versión mínima para todos los paquetes.

Puede usar Git para examinar las versiones de esa línea base concreta:

git show 3426db05b996481ca31e95fff3734cf23e0f51bc:versions/baseline.json | Select-String -Pattern '"zlib"|"fmt"' -Context 0,3

La salida debería tener un aspecto similar al siguiente:

    "fmt": {
      "baseline": "7.1.3",
      "port-version": 1
    },
--
    "zlib": {
      "baseline": "1.2.11",
      "port-version": 9
    },

3- Actualización de las versiones de línea base

Las líneas base ofrecen un mecanismo práctico para actualizar las versiones de todas las dependencias a la vez. Para actualizar la línea base, ejecute el siguiente comando:

vcpkg x-update-baseline

El x-update-baseline comando modifica el archivo de manifiesto para establecer builtin-baseline en la confirmación de Git actual de la instancia de vcpkg.

Puede usar la --add-initial-baseline opción para agregar un builtin-baseline elemento a un manifiesto que aún no tiene uno.

4- Adición de una restricción de versión mínima

Las líneas base no son la única manera de bloquear la versión de un paquete. vcpkg también acepta restricciones de versión mínimas en forma de version>=.

Modifique el contenido de vcpkg.json en:

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

El archivo de manifiesto anterior usa la notación de objetos de dependencia para establecer una restricción de versión mínima (version>=) en fmt. Para satisfacer las dependencias vcpkg debe satisfacer dos restricciones, una procedente de la línea base y otra procedente de la restricción de versión mínima de la dependencies lista.

  • Restricción de línea base, "version>=": "7.1.3".
  • Restricción de lista de dependencias, "version>=": "10.1.1".

Compile y ejecute el proyecto, reemplace por %VCPKG_ROOT% la ruta de instalación de vcpkg:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

Los resultados deberán tener un aspecto similar al siguiente:

fmt version is 100100
zlib version is 1.2.11

En este caso, la versión 10.1.1 de fmt satisface ambas restricciones. Observe cómo zlib obtiene su versión 1.2.11de línea base .

5 - Forzar una versión específica

En algunos casos, puede forzar una versión específica de un paquete, por ejemplo:

  • Para resolver conflictos de versión.
  • Para bloquear versiones anteriores a la línea base.
  • Para bloquear versiones que, de lo contrario, son incomparables, por ejemplo: vista, xp.

vcpkg permite resolver estos problemas mediante invalidaciones de versión.

Modifique el vcpkg.json contenido para:

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

Cualquier paquete incluido en la "overrides" lista usará la versión especificada al omitir todas las demás restricciones de versión. En este ejemplo, la línea base 3426db05b996481ca31e95fff3734cf23e0f51bc agrega una restricción de versión mínima en zlib , 1.2.11 pero la declaración de invalidación fuerza la versión 1.2.8 en su lugar.

Compile y ejecute el proyecto, reemplace por %VCPKG_ROOT% la ruta de instalación de vcpkg:

rm -r build
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake
cmake --build build
./build/main

Los resultados deberán tener un aspecto similar al siguiente:

fmt version is 100100
zlib version is 1.2.8

Pasos siguientes

En este tutorial, ha aprendido los distintos mecanismos que vcpkg ofrece para bloquear versiones específicas del paquete. Lea los conceptos de control de versiones y la referencia para obtener más información sobre cómo vcpkg controla la resolución de versiones.

Estas son algunas tareas adicionales para probar a continuación: