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.11
de 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:
- Reutilización de archivos binarios en ejecuciones de integración continua mediante el almacenamiento en caché binario
- Administración de las bibliotecas privadas mediante registros personalizados