Leer en inglés

Compartir a través de


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

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:

Para obtener más información, vea lo siguiente: