Compartir a través de


Introducción a vcpkg

vcpkg es un administrador de paquetes C/C++ gratuito y de código abierto mantenido por Microsoft y la comunidad de C++ que se ejecuta en Windows, macOS y Linux. Es una herramienta de C++ en el corazón y se escribe mediante scripts de C++ y CMake. Está diseñado para abordar los puntos débiles únicos con la administración de bibliotecas de C/C++.

¿Por qué vcpkg?

  • Más de 2300 bibliotecas de código abierto entre las que elegir en un registro mantenido, creado de forma rutinaria para comprobar la compatibilidad de ABI
  • Creación de su propio registro de biblioteca personalizada con sus propios paquetes de biblioteca personalizados
  • Experiencia coherente y multiplataforma para Windows, macOS y Linux
  • Agregar fácilmente bibliotecas al proyecto con cualquier sistema de compilación y proyecto
  • Compile dependencias a partir de archivos binarios comprobados por ABI creados previamente o descargue, con más de 70 configuraciones disponibles de forma predeterminada y personalización infinita para sus requisitos específicos.
  • Evitar conflictos de versiones y problemas de diamantes entre las dependencias con un diseño de control de versiones único
  • Para los usuarios de MSBuild y CMake: integración automática con el entorno de compilación para una experiencia de adquisición de dependencias sin problemas
  • De confianza para estudiantes, desarrolladores de código abierto, aficionados y profesionales por igual, incluidas algunas de las empresas más grandes

Características de vcpkg

Puertos y tripletos

Un puerto vcpkg es una receta de compilación con versiones que genera un paquete. El tipo de paquete más común es una biblioteca de C/C++ que consta de encabezados, código fuente y archivos binarios.

Un triplete captura el entorno de compilación de destino (cpu, os, compilador, runtime, etcetera).) en un único nombre práctico. vcpkg proporciona más de 70 triplets de forma predeterminada, pero también puede definir sus propios.

Para instalar un paquete en el sistema, vcpkg ejecuta el archivo de recetas del puerto, que es un script de CMake. El script puede contener pasos para descargar código fuente o para ejecutar una compilación en el sistema. Durante las compilaciones, vcpkg usa la información del triplete para asegurarse de que el paquete generado coincide con la configuración deseada.

Almacenamiento en caché binario

Aunque vcpkg compila bibliotecas desde el origen siempre que sea necesario, puede realizar una copia de seguridad de los paquetes integrados en una memoria caché binaria. Esto permite que otras máquinas de desarrollador o ejecuciones de integración continua hagan referencia a estos paquetes creados previamente sin ejecutar una nueva compilación cada vez. vcpkg determina si es necesaria una recompilación comprobando si la memoria caché ya contiene un paquete existente válido con los archivos binarios adecuados.

Manifiestos

Puede declarar las dependencias directas y agregar características opcionales o restricciones de versión en un archivo de manifiesto. Los archivos de manifiesto se pueden comprobar en el sistema de control de código fuente y compartirlos con su equipo.

Control de versiones

vcpkg tiene una manera única de controlar las versiones del paquete. El archivo de manifiesto puede hacer referencia a una sola versión de línea base establecida de forma predeterminada. La línea de base proporciona administración de dependencias sin problemas y sin conflictos con una reproducibilidad completa. Además, todavía puede tener un control más avanzado anclando versiones de paquete individuales.

Registros

Un registro es una colección de puertos y versiones disponibles que un usuario de vcpkg puede instalar. vcpkg proporciona un registro mantenido de bibliotecas de código abierto de forma predeterminada. También puede crear sus propios registros para personalizaciones, revisiones o bibliotecas privadas.

Almacenamiento en caché de recursos

El almacenamiento en caché de recursos permite que vcpkg funcione en entornos sin conexión y con disponibilidad inalámbrica, lo que garantiza la continuidad del negocio incluso si un host remoto deja de funcionar o está en peligro. Usa reflejos de descarga para cargar y restaurar recursos como código fuente y herramientas de compilación.

vcpkg en comparación con otros administradores de paquetes

vcpkg en comparación con NuGet

NuGet es un administrador de paquetes de .NET que a menudo se usa para el desarrollo de C/C++, especialmente para las soluciones de MSBuild que contienen proyectos de .NET. Como regla general, el equipo de Microsoft C++ no recomienda usar NuGet para el desarrollo de C/C++ porque NuGet tiene varias limitaciones:

  • Tipos de compilación. Dado que NuGet no puede compilar paquetes desde el origen sobre la marcha, es necesario proporcionar archivos binarios creados previamente para que coincidan con todas las restricciones posibles de la interfaz binaria de aplicaciones (ABI) para todos los usuarios. El usuario es responsable de compilar correctamente los paquetes. También es difícil distinguir entre archivos binarios debido a la falta de metadatos pertinentes. Esto da como resultado que el usuario coloque la arquitectura, el sistema operativo y la información del compilador en el nombre del paquete. Esto no es deseable porque no se pueden aplicar restricciones en la arquitectura, el sistema operativo y la información del compilador durante la adquisición de paquetes.
  • Binario frente al origen. NuGet está diseñado desde cero para proporcionar archivos binarios relativamente pequeños y creados previamente. Los desarrolladores deben tener acceso al código fuente para garantizar la compatibilidad, el rendimiento, la integridad y la depuración de ABI.
  • No se admite PackageReference de NuGet. PackageReference de NuGet no es compatible con .vcxproj los archivos y no hay ningún plan para agregarlo en el futuro debido a diferencias técnicas y arquitectónicas entre proyectos de C++ y .NET MSBuild. Esto significa que los usuarios de C++ de NuGet no se beneficiarán de características como el uso de la caché global y la referencia a dependencias en términos sencillos de MSBuild con acceso a la lógica condicional.
  • Seguimiento transitivo de ABI. vcpkg vuelve a generar dependencias de código abierto afectadas por un cambio en un paquete determinado. Por ejemplo, si se publica una nueva actualización para Boost, vcpkg vuelve a generar todas las dependencias de Boost y las bibliotecas que dependen de Boost, para asegurarse de que siguen funcionando. Las solicitudes de incorporación de cambios para actualizar las bibliotecas del repositorio vcpkg no se combinan hasta que se solucionan los conflictos en tiempo de compilación.

vcpkg en comparación con los administradores de paquetes del sistema

Hay una amplia variedad de administradores de paquetes del sistema para Linux, macOS y Windows que se pueden usar para adquirir y administrar bibliotecas de C/C++. Estos administradores de paquetes suelen ser excelentes opciones para administrar aplicaciones. Pero debido a la naturaleza genérica de su soporte técnico, a menudo no ofrecen características beneficiosas especialmente para los desarrolladores de C/C++. Aunque el kilometraje variará y algunos administradores de paquetes del sistema ofrecen algunas de estas características, ninguna tiene lo siguiente:

  • Recursos de desarrollador redistribuibles: vcpkg puede adquirir recursos de desarrollador redistribuibles para ayudar con la depuración.
  • Paquetes precompilados frente a compilación a partir del origen: vcpkg puede compilar paquetes a partir del origen en función de sus requisitos personalizados. No es necesario tratar con paquetes precompilados y precompilados para que funcionen.
  • Control de versiones para todo el catálogo: vcpkg permite depender de un conjunto de versiones de paquetes compatibles, en lugar de tener que administrar versiones de paquetes individuales. Todavía puede hacerlo según sea necesario, pero la experiencia predeterminada está diseñada para ser fácil de empezar a trabajar.
  • Varias copias de la misma biblioteca en un sistema: puede tener varias copias de la misma dependencia instaladas en el mismo sistema con vcpkg, mientras que los administradores de paquetes del sistema pueden instalar una versión en una sola ubicación en todo el sistema. Esto complica las cosas cuando tiene varios proyectos en función de diferentes versiones de una biblioteca.
  • Tamaño del catálogo: dado que vcpkg está especializado para C/C++, tiene una colección de bibliotecas de C/C++ muy grande en comparación con los administradores de paquetes del sistema y se mantiene activamente. En general, es más probable que encuentre bibliotecas útiles y actualizadas para el desarrollo de C++.
  • Compatibilidad multiplataforma: los administradores de paquetes del sistema proporcionan paquetes bloqueados a un sistema determinado. Si necesita tener como destino más de un tipo de sistema operativo, deberá encontrar un administrador de paquetes diferente para el segundo sistema. Por el contrario, vcpkg es un administrador de paquetes multiplataforma. Por lo tanto, solo tiene que ajustar las compilaciones de destino en consecuencia.

Hay situaciones en las que un administrador de paquetes del sistema tiene sentido:

  • Los administradores de paquetes del sistema tienden a hacer un buen trabajo proporcionando y manteniendo bibliotecas específicas de ese sistema
  • Los paquetes creados previamente deben funcionar de forma predeterminada en ese sistema si el proyecto de consumo tiene una configuración de compilación sencilla.
  • Si no tiene previsto realizar ningún desarrollo multiplataforma, no se encontrará con problemas de compatibilidad del sistema operativo con un administrador de paquetes del sistema.

vcpkg está diseñado para trabajar en paralelo con administradores de paquetes del sistema, así que no dude en usar la herramienta que tiene más sentido para cada dependencia.

Introducción a vcpkg

Para probar vcpkg, consulte nuestros tutoriales introductorios:

Si el sistema de compilación no es CMake o MSBuild, vcpkg también admite la integración manual con su entorno preferido.