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-lib
provient, 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-lib
mais 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
Exemple 3 : Plusieurs projets connexes dans un référentiel unique
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 :
- Sur la ligne de commande d’installation, passez
--x-feature=
- Lorsque vous utilisez L’intégration CMake, définissez
VCPKG_MANIFEST_FEATURES
avant laproject()
commande. - Lors de l’utilisation de MSBuild Integration, passez
--x-feature=
viaVcpkgAdditionalInstallOptions
Pour plus d’informations, consultez les rubriques suivantes :