Číst v angličtině

Sdílet prostřednictvím


Koncept: funkce

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".

Příklad 1: Více formátů souborů

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

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.

Příklad 2: Výchozí funkce v akci

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.

Řešení závislostí

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.

Pokročilé využití

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:

Další informace najdete v následujících článcích: