Koncept: funkce
Funkce představují sady funkcí, chování a závislostí, které je možné při instalaci selektivně přidat do balíčku nebo projektu.
Funkce by měly podle návrhu dodržovat tyto principy:
- Sčítání: Povolení funkce by mělo poskytovat nové funkce, jinak v balíčku chybí, aniž by se zakázaly jakékoli další funkce.
- Nevýlučné: Povolení funkce by nemělo bránit instalaci jiných funkcí.
Funkce by se neměly používat k definování alternativních sad funkcí. Grafická knihovna by například neměla používat funkce k výběru mezi exkluzivními grafickými back-endy, protože není možné nainstalovat všechny najednou.
Funkce můžou mít na závislosti balíčku následující účinky:
- Přidejte nové závislosti, včetně závislostí na dalších funkcích ze stejného balíčku.
- Povolte nové funkce u existujících závislostí.
Dostupná sada funkcí je definována polem"features"
.
Knihovna pro manipulaci s obrázky může například podporovat několik různých typů obrázků v závislosti na různých sadách jiných knihoven.
{
"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"]},
}
}
Výchozí funkce jsou sada funkcí, které se mají aktivovat automaticky, pokud projekt nejvyšší úrovně explicitně nevyžaduje sestavení bez nich. Výchozí funkce jsou určeny k zajištění minimální úrovně funkčnosti bez ohledu na to, jak složitý a přizpůsobitelný graf závislostí projektu roste.
Poznámka
Výchozí funkce nejsou určené k modelování "curation" nebo "suggestions".
Představte si například knihovnu "extract-any"
, která podporuje více než 10 různých formátů archivace, včetně několika, které jsou poměrně nejasné. Protože jsou všechny volitelné, pokud není vybrána žádná knihovna není funkční: nemůže extrahovat žádné soubory.
Výchozí funkce zajišťují, že uživatel, který jednoduše přidá "extract-any"
do seznamu závislostí ve svém vcpkg.json
seznamu, získá základní úroveň funkčnosti, například automatické výběry .zip
a .tar.gz
dekompresory.
Když uživatel přidá "extract-any"
vcpkg.json
funkce bez zadání funkcí, automaticky se zahrnou výchozí funkce (např. podpora pro .zip
a .tar.gz
formáty), které zajistí základní funkce.
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
"extract-any"
]
}
Pokud chce uživatel explicitně zakázat výchozí funkce, může to udělat přidáním "default-features": false
do závislosti:
{
"name": "my-application",
"version": "0.15.2",
"dependencies": [
{
"name": "extract-any",
"default-features": false
}
]
}
Případně pokud používáte vcpkg v klasickém režimu, můžete prostřednictvím této funkce zakázat výchozí funkce core
. Například vcpkg install extract-any[core]
nainstaluje extract-any
bez výchozích funkcí, protože [core]
je explicitně vylučuje.
Další informace najdete v článku o výchozích funkcích.
Při použití vcpkg hraje řešení závislostí zásadní roli, zejména při práci s funkcemi, které mají vzájemné závislosti. Pro ilustraci zvažte následující scénář zahrnující knihovnu pro manipulaci s obrázky:
{
"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"]},
}
}
Ve scénářích, kdy různé knihovny závisejí na různých funkcích společné knihovny, vcpkg zajistí, že se považují všechny požadované funkce a závislosti. Pokud například library-a
vyžadujete png
tuto funkci a library-b
vyžaduje jpeg
ji my-image-lib
, graf závislostí by vypadal takto:
{
"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"
]
}
Při řešení těchto závislostí vcpkg zkombinuje všechny potřebné funkce a závislosti a vytvoří komplexní plán instalace. V tomto příkladu by projekt v závislosti na obojím a výsledkem by byl plán instalace, který zahrnuje jak PNG
podporuJPEG
, tak podporu z my-image-lib
, ale ne TIFF
:library-b
library-a
libjpeg-turbo[core]
libpng[core]
library-a[core]
library-b[core]
my-image-lib[core,png,jpeg]
Tento mechanismus zajišťuje, že sestavení my-image-lib
je optimalizované pro požadované funkce, poskytuje podporu PNG
a JPEG
současně vylučuje nepotřebnou TIFF
podporu.
Pokud jedno úložiště obsahuje několik samostatných buildovatelných komponent, jako jsou klientské a serverové aplikace s některým sdíleným kódem, můžou vývojáři každé části chtít zabránit instalaci drahých závislostí vyžadovaných jinými částmi.
{
"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"] }
}
}
Jednotliví vývojáři pak můžou vybrat, které funkce se mají nainstalovat:
- Na příkazovém řádku instalace předejte příkaz
--x-feature=
- Při použití integrace CMake nastavte
VCPKG_MANIFEST_FEATURES
před příkazemproject()
. - Při použití integrace NÁSTROJE MSBuild předávat
--x-feature=
přesVcpkgAdditionalInstallOptions
Další informace najdete v následujících článcích:
Zpětná vazba k produktu vcpkg
vcpkg je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby: