Konzept: Features
Features
Features stellen Sätze von Funktionen, Verhalten und Abhängigkeiten dar, die bei der Installation einem Paket oder Projekt selektiv hinzugefügt werden können.
Im Design sollten die Features den folgenden Prinzipien entsprechen:
- Additive: Die Aktivierung eines Features sollte andernfalls neue Funktionen bereitstellen, die im Paket fehlen, ohne andere Funktionen zu deaktivieren.
- Nicht exklusiv: Das Aktivieren eines Features sollte nicht verhindern, dass andere Features installiert werden.
Features sollten nicht verwendet werden, um alternative Funktionsgruppen zu definieren. Beispielsweise sollte eine Grafikbibliothek keine Features verwenden, um zwischen exklusiven Grafik-Back-Ends zu wählen, da es nicht möglich ist, alle gleichzeitig zu installieren.
Features können die folgenden Auswirkungen auf die Abhängigkeiten eines Pakets haben:
- Fügen Sie neue Abhängigkeiten hinzu, einschließlich Abhängigkeiten von anderen Features aus demselben Paket.
- Aktivieren Sie neue Features für vorhandene Abhängigkeiten.
Die verfügbaren Features werden durch das "features"
Feld definiert.
Beispiel 1: Mehrere Dateiformate
Eine Bildmanipulationsbibliothek kann beispielsweise verschiedene Bildtypen unterstützen, je nach unterschiedlichen Gruppen anderer Bibliotheken.
{
"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"]},
}
}
Standardfeatures
Standardfeatures sind eine Reihe von Features, die automatisch aktiviert werden sollen, wenn das Projekt auf oberster Ebene keinen Build explizit anfordert. Standardfeatures sollen sicherstellen, dass ein Mindestmaß an Funktionalität gewährleistet ist, unabhängig davon, wie komplex und anpassbar die Abhängigkeitsdiagramm eines Projekts wächst.
Hinweis
Standardfeatures sind nicht zum Modellieren von "Curation" oder "Suggestions" vorgesehen.
Betrachten Sie beispielsweise eine Bibliothek "extract-any"
, die mehr als 10 verschiedene Archivformate unterstützt, einschließlich mehrerer, die ziemlich verdeckt sind. Da sie alle optional sind, wenn keines ausgewählt ist, ist die Bibliothek nicht funktionsfähig: Sie kann keine Dateien extrahieren.
Standardfeatures stellen sicher, dass ein Benutzer, der einfach der Liste der Abhängigkeiten in seiner Liste hinzufügt"extract-any"
, eine grundlegende Funktionalitätsebene erhält, z. B. automatische Auswahl .zip
und .tar.gz
Dekomprimierung.vcpkg.json
Beispiel 2: Standardfeatures in Aktion
Wenn ein Benutzer dem vcpkg.json
Benutzer ohne Angabe von Features hinzufügt"extract-any"
, werden die Standardfeatures (z. B. Unterstützung für .zip
und .tar.gz
Formate) automatisch einbezogen, wodurch grundlegende Funktionen sichergestellt werden.
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
"extract-any"
]
}
Wenn der Benutzer die Standardfeatures explizit deaktivieren möchte, kann er dies tun, indem er der Abhängigkeit hinzufügt "default-features": false
:
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
{
"name": "extract-any",
"default-features": false
}
]
}
Alternativ können Sie bei Verwendung von vcpkg im klassischen Modus Standardfeatures über das core
Feature deaktivieren. Installiert beispielsweise vcpkg install extract-any[core]
ohne Standardfeatures extract-any
, da [core]
sie explizit ausgeschlossen werden.
Weitere Informationen finden Sie im Artikel "Standardfeatures".
Abhängigkeitsauflösung
Bei der Verwendung von vcpkg spielt die Abhängigkeitsauflösung eine entscheidende Rolle, insbesondere beim Umgang mit Features mit Abhängigkeiten. Betrachten Sie zum Veranschaulichen das folgende Szenario mit einer Bildmanipulationsbibliothek:
{
"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"]},
}
}
In Szenarien, in denen unterschiedliche Bibliotheken von verschiedenen Features einer gemeinsamen Bibliothek abhängen, stellt vcpkg sicher, dass alle erforderlichen Features und Abhängigkeiten berücksichtigt werden. Wenn z. Blibrary-a
. das png
Feature erforderlich ist und library-b
das jpeg
Feature aus my-image-lib
erforderlich ist, würde die Abhängigkeitsdiagramm wie folgt aussehen:
{
"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"
]
}
Wenn diese Abhängigkeiten aufgelöst werden, kombiniert vcpkg alle erforderlichen Features und Abhängigkeiten, um einen umfassenden Installationsplan zu bilden. In diesem Beispiel würde ein Projekt abhängig von beiden library-a
und library-b
zu einem Installationsplan führen, der beide PNG
und JPEG
Support my-image-lib
umfasst, aber nicht TIFF
:
libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]
Dieser Mechanismus stellt sicher, dass der Build von my-image-lib
für die erforderlichen Features optimiert ist, unterstützung für PNG
und JPEG
ohne unnötigen TIFF
Support.
Erweiterte Verwendung
Beispiel 3: Mehrere verwandte Projekte in einem einzigen Repository
Wenn ein einzelnes Repository mehrere separate buildierbare Komponenten enthält, z. B. Client- und Serveranwendungen mit einem freigegebenen Code, sollten Entwickler jedes Teils die Installation teurer Abhängigkeiten vermeiden, die von anderen Teilen benötigt werden.
{
"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"] }
}
}
Einzelne Entwickler können dann auswählen, welche Features installiert werden sollen:
- Übergeben Sie auf der Befehlszeile für die Installation
--x-feature=
- Wenn Sie die CMake-Integration verwenden, legen Sie vor dem
project()
Befehl festVCPKG_MANIFEST_FEATURES
. - Übergeben Sie bei Verwendung der MSBuild-Integration über
--x-feature=
VcpkgAdditionalInstallOptions
Weitere Informationen finden Sie unter