Partager via


Concept : fonctionnalités

Fonctionnalités

Les fonctionnalités représentent des ensembles de fonctionnalités, de comportement et de dépendances qui peuvent être ajoutées de manière sélective à un package ou un projet lors de l’installation.

Par conception, les fonctionnalités doivent respecter ces principes :

  • Additif : l’activation d’une fonctionnalité doit fournir de nouvelles fonctionnalités manquantes dans le package sans désactiver d’autres fonctionnalités.
  • Non exclusif : l’activation d’une fonctionnalité ne doit pas empêcher l’installation d’autres fonctionnalités.

Les fonctionnalités ne doivent pas être utilisées pour définir d’autres ensembles de fonctionnalités. Par exemple, une bibliothèque graphique ne doit pas utiliser de fonctionnalités pour choisir entre les back-ends graphiques exclusifs, car il n’est pas possible d’installer tous ces éléments en même temps.

Les fonctionnalités peuvent avoir les effets suivants sur les dépendances d’un package :

  • Ajoutez de nouvelles dépendances, y compris les dépendances sur d’autres fonctionnalités du même package.
  • Activez de nouvelles fonctionnalités sur les dépendances existantes.

L’ensemble des fonctionnalités disponibles est défini par le "features" champ.

Exemple 1 : Plusieurs formats de fichier

Une bibliothèque de manipulation d’images, par exemple, peut prendre en charge plusieurs types d’images différents en fonction de différents ensembles d’autres bibliothèques.

{
  "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"]},
  }
}

Fonctionnalités par défaut

Les fonctionnalités par défaut sont un ensemble de fonctionnalités à activer automatiquement si le projet de niveau supérieur ne demande pas explicitement une build sans eux. Les fonctionnalités par défaut sont destinées à garantir un niveau minimal de fonctionnalités, quelle que soit la complexité et la personnalisation des graphe des dépendances d’un projet.

Remarque

Les fonctionnalités par défaut ne sont pas destinées à modéliser « curation » ou « suggestions ».

Par exemple, considérez une bibliothèque "extract-any" qui prend en charge plus de 10 formats d’archive différents, y compris plusieurs qui sont assez obscurs. Étant donné qu’elles sont toutes facultatives, si aucune n’est sélectionnée, la bibliothèque n’est pas fonctionnelle : elle ne peut pas extraire de fichiers.

Les fonctionnalités par défaut garantissent qu’un utilisateur qui ajoute "extract-any" simplement à la liste des dépendances dans sa vcpkg.json base de données obtient un niveau de référence de fonctionnalité ; par exemple, en sélectionnant .zip et .tar.gz décompresseurs automatiquement.

Exemple 2 : Fonctionnalités par défaut en action

Lorsqu’un utilisateur ajoute "extract-any" à ses vcpkg.json fonctionnalités sans spécifier de fonctionnalités, les fonctionnalités par défaut (par exemple, la prise en charge .zip et .tar.gz les formats) sont automatiquement incluses, garantissant ainsi la fonctionnalité de base.

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    "extract-any"
  ]
}

Si l’utilisateur souhaite désactiver explicitement les fonctionnalités par défaut, il peut le faire en ajoutant "default-features": false à la dépendance :

{
  "name": "my-application",
  "version": "0.15.2",
  "dependencies": [
    {
      "name": "extract-any",
      "default-features": false
    }
  ]
}

Sinon, si vous utilisez vcpkg en mode classique, vous pouvez désactiver les fonctionnalités par défaut via la core fonctionnalité. Par exemple, vcpkg install extract-any[core] les extract-any installations sans fonctionnalités par défaut, car [core] elles les excluent explicitement.

Pour plus d’informations, case activée l’article sur les fonctionnalités par défaut.

Résolution des dépendances

Lors de l’utilisation de vcpkg, la résolution des dépendances joue un rôle crucial, en particulier lorsque vous traitez des fonctionnalités qui ont des interdépendances. Pour illustrer ce scénario, envisagez le scénario suivant impliquant une bibliothèque de manipulation d’images :

{
  "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"]},
  }
}

Dans les scénarios où différentes bibliothèques dépendent de différentes fonctionnalités d’une bibliothèque commune, vcpkg garantit que toutes les fonctionnalités et dépendances requises sont prises en compte. Par exemple, si library-a vous avez besoin de la png fonctionnalité et library-b que celle-ci jpeg my-image-libprovient, la graphe des dépendances ressemblerait à ceci :

{
  "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"
  ]
}

Lorsque ces dépendances sont résolues, vcpkg combine toutes les fonctionnalités et dépendances nécessaires pour former un plan d’installation complet. Dans cet exemple, un projet en fonction des deux library-a et library-b entraînerait un plan d’installation qui inclut les deux PNG et JPEG la prise en charge, my-image-libmais pas TIFF:

libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]

Ce mécanisme garantit que la build d’une my-image-lib version est optimisée pour les fonctionnalités requises, en fournissant une prise en charge et JPEG en excluant la prise en charge PNG inutileTIFF.

Utilisation avancée

Lorsqu’un dépôt unique contient plusieurs composants pouvant être générés distincts, tels que les applications clientes et serveurs avec du code partagé, les développeurs de chaque élément peuvent vouloir éviter d’installer des dépendances coûteuses requises par d’autres éléments.

{
  "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"] }
  }
}

Les développeurs individuels peuvent ensuite sélectionner les fonctionnalités à installer :

Pour plus d’informations, consultez les rubriques suivantes :