Auf Englisch lesen

Freigeben über


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-liberforderlich 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-libumfasst, 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

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:

Weitere Informationen finden Sie unter