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
Esempio 3: più progetti correlati in un singolo repository
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:
- Nella riga di comando di installazione passare
--x-feature=
- Quando si usa L'integrazione CMake, impostare
VCPKG_MANIFEST_FEATURES
prima delproject()
comando. - Quando si usa l'integrazione di MSBuild, passare
--x-feature=
tramiteVcpkgAdditionalInstallOptions
Per altre informazioni, vedere gli argomenti seguenti: