Koncepty správy verzí

Minimální správa verzí

Vcpkg používá minimální výběrový přístup k správě verzí, inspirovaný verzí , který používá Go, ale upraven některými způsoby:

  • Vždy začíná od nové instalace, eliminuje potřebu operací upgradu nebo downgradu.
  • Povolte nekontrénované závislosti zavedením standardních hodnot.

Minimální princip výběru však zůstává stejný. Vzhledem k sadě omezení bude vcpkg používat "nejstarší" možné verze balíčků, které mohou splňovat všechna omezení.

Použití přístupu s minimální verzí má následující výhody:

  • Je předvídatelné a snadno pochopitelné.
  • Uživatelské ovládací prvky, kdy dojde k upgradům, stejně jako v případě, že dojde k žádným upgradům, se při vydání nové verze automaticky neprovedou žádné upgrady.
  • Vyhněte se použití řešitele SAT.

Pokud chcete uvést příklad, zvažte následující graf balíčků:

    (A 1.0) -> (B 1.0)

    (A 1.1) -> (B 1.0) 
            -> (C 3.0) 

    (A 1.2) -> (B 2.0)
            -> (C 3.0)

    (C 2.0)

A následující manifest:

{
    "name": "example",
    "version": "1.0.0",
    "dependencies": [ 
        { "name": "A", "version>=": "1.1" },
        { "name": "C", "version>=": "2.0" }
    ], 
    "builtin-baseline": "<some git commit with A's baseline at 1.0>"
}

Po účtování přechodných závislostí máme následující sadu omezení:

  • A >= 1,1
    • B >= 1,0
    • C >= 3,0
  • C >= 2,0

Vzhledem k tomu, že vcpkg musí splňovat všechna omezení, sada nainstalovaných balíčků se stane:

  • A 1.1, i když A 1.2 existuje, neexistují žádná omezení vyšší než 1.1 proto, že vcpkg vybere minimální možnou verzi.
  • B 1.0, tranzitivně vyžadované A 1.1.
  • C 3.0, upgradováno tranzitivním omezením přidaným B 1.0 za účelem splnění omezení verzí.

Rozlišení omezení

Vzhledem k manifestu se sadou verzí závislostí se vcpkg pokusí vypočítat plán instalace balíčku, který splňuje všechna omezení.

Omezení verzí mají následující varianty:

  • Deklarovaná omezení: Omezení deklarovaná explicitně v manifestu nejvyšší úrovně pomocí version>=.
  • Omezení směrného plánu: Omezení přidaná implicitně pomocí parametru builtin-baseline.
  • Tranzitivní omezení: Omezení přidaná nepřímo závislostmi vašich závislostí.
  • Přepsáná omezení: Omezení přepsaná v manifestu nejvyšší úrovně pomocí overrides deklarací.

Při výpočtu plánu instalace se vcpkg řídí zhruba těmito kroky:

  • Přidejte do plánu všechna omezení nejvyšší úrovně.
  • Rekurzivní přidání přechodných omezení do plánu.
    • Pokaždé, když se do plánu přidá nový balíček, přidejte do plánu také omezení směrného plánu.
    • Pokaždé, když se přidá omezení:
    • Pokud pro balíček existuje přepsání
      • Vyberte verzi v přepsání.
    • Jinak:
      • Pokud není vybraná žádná předchozí verze.
        • Vyberte minimální verzi, která splňuje omezení.
      • Pokud je vybraná předchozí verze:
        • Pokud schéma správy verzí nového omezení neodpovídá schématu dříve vybrané verze:
          • Přidání konfliktu verzí
        • Pokud verze omezení není srovnatelná s dříve vybranou verzí. Například porovnání "version-string: apple" s "version-string: orange":
          • Přidání konfliktu verzí
        • Pokud je verze omezení vyšší než dříve vybraná verze:
          • Vyberte nejvyšší verzi.
        • Jinak:
          • Ponechte předchozí výběr.
  • Zkontrolujte plán:
    • Pokud nedojde ke konfliktům
      • Instalace vybraných balíčků
    • Jinak:
      • Nahlášení konfliktů uživateli

Získání verzí portů

Přestože koncept verzí balíčků byl vcpkg vždy k dispozici, koncept omezení verzí nebyl.

Při zavedení omezení správy verzí je teď možné, že balíček závisí na verzi portu, která neodpovídá verzi dostupné místně. To vyvolá problém, protože vcpkg potřebuje vědět, jak získat soubory portů pro požadovanou verzi.

K vyřešení tohoto problému byla zavedena nová sada souborů metadat. Tyto soubory se nacházejí v versions/ adresáři na kořenové úrovni úložiště vcpkg.

Adresář versions/ bude obsahovat soubory JSON pro každý z portů dostupných v registru. Každý soubor zobrazí seznam všech verzí dostupných pro balíček a bude obsahovat objekt stromové struktury Gitu, který může vcpkg rezervovat a získat soubory portů této verze.

Příklad: zlib.json

{
  "versions": [
    {
      "git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
      "version-string": "1.2.11",
      "port-version": 9
    },
    ...
    {
      "git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
      "version-string": "1.2.10",
      "port-version": 0
    },
    {
      "git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
      "version-string": "1.2.8",
      "port-version": 0
    }
  ]
}

Pro každý port, jeho odpovídající verze soubor by měl být umístěn v versions/{first letter of port name}-/{port name}.json. Například soubor verze zlib bude umístěn v versions/z-/zlib.json. Kromě souborů verze portu se aktuální základní soubor nachází v versions/baseline.json.