Tutorial: Instalación de una dependencia desde un archivo de manifiesto
vcpkg tiene dos modos de operación: modo clásico y modo de manifiesto. En este artículo se describe cómo instalar paquetes mediante el modo de manifiesto, que es el flujo de trabajo recomendado para la mayoría de los usuarios.
En el modo de manifiesto, declara las dependencias directas del proyecto en un archivo de manifiesto denominado vcpkg.json
.
Los archivos de manifiesto tienen su propio vcpkg_installed
directorio donde instalan dependencias, a diferencia del modo clásico, donde todos los paquetes se instalan en un directorio común %VCPKG_ROOT%/installed
. Por lo tanto, cada proyecto puede tener su propio manifiesto y su propio conjunto de dependencias que no entran en conflicto con las dependencias de otros proyectos.
El modo de manifiesto también es necesario para usar características avanzadas, como el control de versiones y los registros personalizados.
En este tutorial, aprenderá a:
Requisitos previos
- vcpkg
- Un terminal
- Editor de código
- Un compilador de C++
- (Opcional) CMake o MSBuild
1- Creación de un proyecto con un manifiesto
En una nueva carpeta, cree un archivo de origen denominado main.cxx
con este contenido:
#include <cxxopts.hpp>
#include <fmt/format.h>
#include <range/v3/view.hpp>
namespace view = ranges::views;
int fib(int x)
{
int a = 0, b = 1;
for (int it : view::repeat(0) | view::take(x))
{
(void)it;
int tmp = a;
a += b;
b = tmp;
}
return a;
}
int main(int argc, char **argv)
{
cxxopts::Options options("fibo", "Print the fibonacci sequence up to a value 'n'");
options.add_options()("n,value", "The value to print to", cxxopts::value<int>()->default_value("10"));
auto result = options.parse(argc, argv);
auto n = result["value"].as<int>();
for (int x : view::iota(1) | view::take(n))
{
fmt::print("fib({}) = {}\n", x, fib(x));
}
}
El código hace referencia a las bibliotecas de código abierto: cxxopts
, fmt
y range-v3
; que están disponibles en el registro público vcpkg en https://github.com/Microsoft/vcpkg.
Para declarar estas dependencias, cree un archivo denominado vcpkg.json
en el mismo directorio que el proyecto:
vcpkg.json
:
{
"dependencies": [
"cxxopts",
"fmt",
"range-v3"
]
}
Solo tiene que especificar las dependencias directas en la "dependencies"
lista. Cuando se ejecuta, vcpkg resuelve e instala las dependencias transitivas necesarias.
2 - Integración de vcpkg con el sistema de compilación
En este paso se muestra cómo integrar vcpkg con CMake o MSBuild, de modo que las dependencias del proyecto se instalen o restauren automáticamente cada vez que compile el proyecto.
Si usa un sistema de compilación diferente, vaya al paso siguiente: Instalar dependencias.
Para usar vcpkg en los proyectos de MSBuild, ejecute el siguiente comando:
vcpkg integrate install
Solo tiene que ejecutar el vcpkg integrate install
comando la primera vez que quiera habilitar la integración de MSBuild. Esto permite la integración de MSBuild para todos los proyectos existentes y futuros. Use vcpkg integrate remove
para quitar la integración en todo el sistema de MSBuild.
Este método de integración agrega automáticamente paquetes instalados por vcpkg a las siguientes propiedades del proyecto: Include Directories
, Link Directories
y Link Libraries
. Además, esto crea una acción posterior a la compilación que garantiza que los archivos DLL necesarios se copien en la carpeta de salida de compilación. Esto funciona para todas las soluciones y proyectos con Visual Studio 2015 o versiones posteriores.
3- Instalación de dependencias
Si usa CMake o MSBuild y sigue el paso anterior, puede ir directamente al paso siguiente: Compilar el proyecto.
Si usa un sistema de compilación diferente o desea instalar manualmente las dependencias, lo único que debe hacer es ejecutarlo vcpkg install
en el directorio que contiene el archivo de manifiesto.
PS D:\projects\manifest-example> vcpkg install
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
cxxopts:x64-windows -> 3.1.1
fmt:x64-windows -> 10.0.0
range-v3:x64-windows -> 0.12.0#1
* vcpkg-cmake:x64-windows -> 2023-05-04
* vcpkg-cmake-config:x64-windows -> 2022-02-06#1
Additional packages (*) will be modified to complete this operation.
Installing 1/5 vcpkg-cmake-config:x64-windows...
Installing 2/5 vcpkg-cmake:x64-windows...
Installing 3/5 cxxopts:x64-windows...
Installing 4/5 fmt:x64-windows...
Installing 5/5 range-v3:x64-windows...
Total install time: 48 s
cxxopts provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(cxxopts CONFIG REQUIRED)
target_link_libraries(main PRIVATE cxxopts::cxxopts)
The package fmt provides CMake targets:
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt)
# Or use the header-only version
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt-header-only)
range-v3 provides CMake targets:
# this is heuristically generated, and may not be correct
find_package(range-v3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE range-v3::meta range-v3::concepts range-v3::range-v3)
Cuando finalice el comando, todos los paquetes compilados estarán presentes en un vcpkg_installed
directorio. La ubicación específica de este directorio depende del sistema de compilación; normalmente, dentro de la carpeta de salida predeterminada del sistema de compilación o junto al vcpkg.json
archivo.
4 - Compilación del proyecto
De forma predeterminada, el modo de manifiesto está deshabilitado en proyectos de MSBuild.
Para habilitar manifiestos en el proyecto, establezca la propiedad en .vcxproj
el VcpkgEnableManifest
archivo:
<PropertyGroup Label="Vcpkg">
<VcpkgEnableManifest>true</VcpkgEnableManifest>
</PropertyGroup>
Como alternativa, puede habilitar el modo de manifiesto en la llamada de MSBuild pasando msbuild /p:VcpkgEnableManifest=true
como parámetro.
PS D:\projects\manifest-example> msbuild /p:VcpkgEnableManifest=true
MSBuild version 17.7.0-preview-23319-02+6829506b8 for .NET Framework
Build started 8/11/2023 11:29:50 AM.
Project "D:\projects\manifest-example\manifest-example.sln" on node 1 (default targets).
ValidateSolutionConfiguration:
Building solution configuration "Debug|x64".
Project "D:\projects\manifest-example\manifest-example.sln" (1) is building "D:\projects\manifest-example\manifest-example.vcxproj" (2) on node 1 (default targets).
PrepareForBuild:
(omitted)
InitializeBuildStatus:
(omitted)
ComputeStdModulesCompileInputs:
(omitted)
SetModuleDependencies:
Creating directory "x64\Debug\manifest.ceffc6eb_MD.tlog\".
VcpkgTripletSelection:
Using triplet "x64-windows" from "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\"
Using normalized configuration "Debug"
VcpkgInstallManifestDependencies:
Installing vcpkg dependencies to D:\projects\manifest-example\vcpkg_installed\x64-windows\
Creating directory "D:\projects\manifest-example\vcpkg_installed\x64-windows\".
"D:\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
"D:\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "D:\vcpkg\" "--x-manifest-root=D:\projects\manifest-example\" "--x-install-root=D:\projects\manifest-example\vcpkg_installed\x64-windows\"
Detecting compiler hash for triplet x64-windows...
The following packages will be built and installed:
cxxopts:x64-windows -> 3.1.1
fmt:x64-windows -> 10.0.0
range-v3:x64-windows -> 0.12.0#1
* vcpkg-cmake:x64-windows -> 2023-05-04
* vcpkg-cmake-config:x64-windows -> 2022-02-06#1
(omitted)
ClCompile:
(omitted)
Link:
(omitted)
AppLocalFromInstalled:
pwsh.exe -ExecutionPolicy Bypass -noprofile -File "D:\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "D:\projects\manif
est-mode-msbuild\x64\Debug\manifest-example.exe" "D:\projects\manifest-example\vcpkg_installed\x64-windows\x64-windows\debug\bin"
"x64\Debug\manifest.ceffc6eb.tlog\manifest-example.write.1u.tlog" "x64\Debug\vcpkg.applocal.log"
D:\projects\manifest-example\x64\Debug\fmtd.dll
FinalizeBuildStatus:
(omitted)
Done Building Project "D:\projects\manifest-example\manifest-example.vcxproj" (default targets).
Done Building Project "D:\projects\manifest-example\manifest-example.sln" (default targets).
Build succeeded.
Pasos siguientes
En esta guía, instaló dependencias para un proyecto sencillo mediante un archivo de manifiesto.
Estas son algunas tareas adicionales para probar a continuación:
- Instalación de paquetes para plataformas personalizadas, compiladores o arquitecturas de compilación mediante tripletas
- Bloquear las versiones de las compilaciones repetibles mediante el control de versiones
- Reutilización de archivos binarios en ejecuciones de integración local o continua mediante el almacenamiento en caché binario
- Administración de las bibliotecas privadas mediante registros personalizados