Concepto: características
Características
Las características representan conjuntos de funcionalidad, comportamiento y dependencias que se pueden agregar de forma selectiva a un paquete o proyecto tras la instalación.
Por diseño, las características deben seguir estos principios:
- Aditivo: la habilitación de una característica debe proporcionar una nueva funcionalidad, de lo contrario, falta en el paquete sin deshabilitar ninguna otra funcionalidad.
- No exclusivo: la habilitación de una característica no debe impedir que se instalen otras características.
Las características no deben usarse para definir conjuntos alternativos de funcionalidades. Por ejemplo, una biblioteca de gráficos no debe usar características para elegir entre back-end gráficos exclusivos, ya que no es posible instalar todos ellos al mismo tiempo.
Las características pueden tener los siguientes efectos en las dependencias de un paquete:
- Agregue nuevas dependencias, incluidas las dependencias de otras características del mismo paquete.
- Habilite las nuevas características en las dependencias existentes.
El conjunto de características disponibles se define mediante el "features"
campo .
Ejemplo 1: Varios formatos de archivo
Una biblioteca de manipulación de imágenes, por ejemplo, podría admitir varios tipos de imágenes diferentes en función de distintos conjuntos de otras bibliotecas.
{
"name": "my-image-lib",
"version": "0.1",
"features": {
"png": { "description": "Support PNG files", "dependencies": ["libpng"]},
"jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
"tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
}
}
Características predeterminadas
Las características predeterminadas son un conjunto de características que se activarán automáticamente si el proyecto de nivel superior no solicita explícitamente una compilación sin ellas. Las características predeterminadas están diseñadas para garantizar un nivel mínimo de funcionalidad, independientemente de la complejidad y la personalización del gráfico de dependencias de un proyecto.
Nota:
Las características predeterminadas no están pensadas para modelar "curación" ni "sugerencias".
Por ejemplo, considere una biblioteca "extract-any"
que admita más de 10 formatos de archivo diferentes, incluidos varios que son bastante oscuros. Dado que todos son opcionales, si ninguno está seleccionado, la biblioteca no es funcional: no puede extraer ningún archivo.
Las características predeterminadas garantizan que un usuario que simplemente agrega "extract-any"
a la lista de dependencias en su vcpkg.json
obtendrá un nivel de base de funcionalidad; por ejemplo, seleccionar .zip
y .tar.gz
descomprimir automáticamente.
Ejemplo 2: Características predeterminadas en acción
Cuando un usuario agrega "extract-any"
a sus vcpkg.json
características sin especificar características, se incluyen automáticamente las características predeterminadas (por ejemplo, compatibilidad con .zip
formatos y .tar.gz
), lo que garantiza la funcionalidad básica.
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
"extract-any"
]
}
Si el usuario quiere deshabilitar explícitamente las características predeterminadas, puede hacerlo agregando "default-features": false
a la dependencia:
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
{
"name": "extract-any",
"default-features": false
}
]
}
Como alternativa, si usa vcpkg en modo clásico, puede deshabilitar las características predeterminadas a través de la core
característica. Por ejemplo, vcpkg install extract-any[core]
se extract-any
instala sin ninguna característica predeterminada, ya que [core]
las excluye explícitamente.
Para obtener más información, consulte el artículo sobre las características predeterminadas.
Resolución de dependencias
Al usar vcpkg, la resolución de dependencias desempeña un papel fundamental, especialmente cuando se trabaja con características que tienen interdependencias. Para ilustrarlo, considere el siguiente escenario que implica una biblioteca de manipulación de imágenes:
{
"name": "my-image-lib",
"version": "0.1",
"features": {
"png": { "description": "Support PNG files", "dependencies": ["libpng"]},
"jpeg": { "description": "Support JPEG files", "dependencies": ["libjpeg-turbo"]},
"tiff": { "description": "Support TIFF files", "dependencies": ["libtiff"]},
}
}
En escenarios en los que diferentes bibliotecas dependen de varias características de una biblioteca común, vcpkg garantiza que se tienen en cuenta todas las características y dependencias necesarias. Por ejemplo, si library-a
requiere la png
característica y library-b
requiere la jpeg
característica de my-image-lib
, el gráfico de dependencias tendría el siguiente aspecto:
{
"name": "library-a",
"version": "1",
"dependencies": [{"name": "my-image-lib", "features": ["png"]}]
}
{
"name": "library-b",
"version": "1",
"dependencies": [{"name": "my-image-lib", "features": ["jpeg"]}]
}
{
"name": "project-using-a-and-b",
"version": "1",
"dependencies": [
"library-a",
"library-b"
]
}
Cuando se resuelven estas dependencias, vcpkg combina todas las características y dependencias necesarias para formar un plan de instalación completo. En este ejemplo, un proyecto en función de y library-a
daría como resultado un plan de instalación que incluye y JPEG
PNG
compatibilidad con my-image-lib
, pero no TIFF
:library-b
libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]
Este mecanismo garantiza que la compilación de my-image-lib
está optimizada para las características necesarias, lo que proporciona compatibilidad con PNG
y JPEG
, a la vez, excluye la compatibilidad innecesaria TIFF
.
Uso avanzado
Ejemplo 3: Varios proyectos relacionados en un único repositorio
Cuando un único repositorio contiene varios componentes compilables independientes, como aplicaciones cliente y servidor con código compartido, es posible que los desarrolladores de cada pieza quieran evitar la instalación de dependencias costosas requeridas por otras partes.
{
"name": "my-game",
"dependencies": ["grpc"],
"features": {
"client": { "description": "Client Game Executable", "dependencies": ["sdl2", "bullet3"]},
"server": { "description": "Multiplayer Server Executable", "dependencies": ["proxygen"]},
"tests": { "description": "Build tests", "dependencies": ["gtest"] }
}
}
Después, los desarrolladores individuales pueden seleccionar qué características instalar:
- En la línea de comandos de instalación, pase
--x-feature=
- Al usar la integración de CMake, establezca
VCPKG_MANIFEST_FEATURES
antes delproject()
comando . - Al usar la integración de MSBuild, pase
--x-feature=
a través deVcpkgAdditionalInstallOptions
Para obtener más información, vea lo siguiente: