Concetto: funzionalità

Funzionalità

Le funzionalità rappresentano set di funzionalità, comportamento e dipendenze che possono essere aggiunte in modo selettivo a un pacchetto o a un progetto al momento dell'installazione.

Per impostazione predefinita, le funzionalità devono seguire questi principi:

  • Additive: l'abilitazione di una funzionalità deve fornire nuove funzionalità altrimenti mancanti dal pacchetto senza disabilitare altre funzionalità.
  • Non esclusivo: l'abilitazione di una funzionalità non deve impedire l'installazione di altre funzionalità.

Le funzionalità non devono essere usate per definire set alternativi di funzionalità. Ad esempio, una libreria grafica non deve usare funzionalità per scegliere tra back-end grafici esclusivi, poiché non è possibile installarli tutti contemporaneamente.

Le funzionalità possono avere gli effetti seguenti sulle dipendenze di un pacchetto:

  • Aggiungere nuove dipendenze, incluse le dipendenze da altre funzionalità dello stesso pacchetto.
  • Abilitare nuove funzionalità nelle dipendenze esistenti.

Il set di funzionalità disponibili è definito dal "features" campo .

Esempio 1: più formati di file

Una libreria di manipolazione delle immagini, ad esempio, potrebbe supportare diversi tipi di immagine a seconda di set diversi di altre librerie.

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

Funzionalità predefinite

Le funzionalità predefinite sono un set di funzionalità da attivare automaticamente se il progetto di primo livello non richiede esplicitamente una compilazione senza di esse. Le funzionalità predefinite sono destinate a garantire un livello minimo di funzionalità indipendentemente dal livello di complessità e personalizzazione del grafico delle dipendenze di un progetto.

Nota

Le funzionalità predefinite non sono destinate al modello "curazione" o "suggerimenti".

Si consideri, ad esempio, una libreria "extract-any" che supporta più di 10 formati di archivio diversi, tra cui diversi che sono piuttosto oscuri. Poiché sono tutti facoltativi, se non è selezionata alcuna libreria non è funzionale: non può estrarre alcun file.

Le funzionalità predefinite assicurano che un utente che aggiunge "extract-any" semplicemente all'elenco delle dipendenze nel relativo vcpkg.json livello di base di funzionalità, ad esempio selezionando .zip e .tar.gz decompressori automaticamente.

Esempio 2: Funzionalità predefinite in azione

Quando un utente aggiunge "extract-any" al proprio vcpkg.json senza specificare le funzionalità, le funzionalità predefinite (ad esempio, il supporto per .zip e .tar.gz i formati) vengono incluse automaticamente, assicurando funzionalità di base.

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

Se l'utente vuole disabilitare in modo esplicito le funzionalità predefinite, è possibile farlo aggiungendo "default-features": false alla dipendenza:

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

In alternativa, se si usa vcpkg in modalità classica, è possibile disabilitare le funzionalità predefinite tramite la core funzionalità . Ad esempio, vcpkg install extract-any[core] installa extract-any senza alcuna funzionalità predefinita, perché [core] le esclude in modo esplicito.

Per altre informazioni, vedere l'articolo sulle funzionalità predefinite.

Risoluzione delle dipendenze

Quando si usa vcpkg, la risoluzione delle dipendenze svolge un ruolo cruciale, soprattutto quando si gestiscono funzionalità che hanno interdipendenze. Per illustrare, considerare lo scenario seguente che include una libreria di manipolazione delle immagini:

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

Negli scenari in cui librerie diverse dipendono da varie funzionalità di una libreria comune, vcpkg garantisce che tutte le funzionalità e le dipendenze necessarie vengano considerate. Ad esempio, se library-a richiede la png funzionalità e library-b richiede la jpeg funzionalità da my-image-lib, il grafico delle dipendenze sarà simile al seguente:

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

Quando queste dipendenze vengono risolte, vcpkg combina tutte le funzionalità e le dipendenze necessarie per formare un piano di installazione completo. In questo esempio, un progetto a seconda library-a di e library-b genera un piano di installazione che include sia PNG che JPEG il supporto di my-image-lib, ma non TIFF:

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

Questo meccanismo garantisce che la compilazione di my-image-lib sia ottimizzata per le funzionalità necessarie, fornendo supporto per PNG e JPEG escludendo il supporto non necessario TIFF .

Uso avanzato

Quando un singolo repository contiene diversi componenti compilabili separati, ad esempio applicazioni client e server con codice condiviso, gli sviluppatori di ogni pezzo possono voler evitare di installare dipendenze costose richieste da altre parti.

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

I singoli sviluppatori possono quindi selezionare le funzionalità da installare:

Per altre informazioni, vedere gli argomenti seguenti: