Sdílet prostřednictvím


Překlad názvů balíčků

Vcpkg před kontaktováním sítě určí příslušný registr (nebo překryvný) pro každý balíček. To brání útokům na záměny závislostí balíčků, protože překlad názvů nezávisí na žádném externím stavu.

Postup algoritmu překladu názvů:

Pokud existuje více "packages" vzorů, které odpovídají názvu, vcpkg určuje prioritu následujícím způsobem:

  1. Přesná shoda -- boost je vybrána. boost*
  2. Nejdelší vzor -- boost* je zvolen nad b*
  3. První shoda – první registr, který deklaruje nejlepší vzor, je zvolen.

Příklad č. 1: Překlad názvů balíčků

vcpkg-configuration.json

{
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/microsoft/vcpkg-docs",
      "reference": "vcpkg-registry",
      "baseline": "768f6a3ad9f9b6c4c2ff390137690cf26e3c3453",
      "packages": ["bei*"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/vicroms/vcpkg-registry",
      "baseline": "dacf4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["beicode", "bei*"]
    }
  ]
}

vcpkg.json

{
  "dependencies": [
    "beicode",
    "beison",
    "fmt"
  ],
  "builtin-baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
}

Vzhledem k této konfiguraci se názvy jednotlivých balíčků přeloží na:

  • beicode: z registru https://github.com/vicroms/vcpkg-registry (přesná shoda dne beicode)
  • beison: z registru https://github.com/Microsoft/vcpkg-docs (shoda vzorů a beison deklarovaná jako první v "registries" poli)
  • fmt: z výchozího registru (žádné shody)

Protože více registrů deklaruje bei*, vcpkg také vygeneruje upozornění:

Found the following problems in configuration (path/to/vcpkg-configuration.json):
$ (a configuration object): warning: Package "bei*" is duplicated.
    First declared in:
        location: $.registries[0].packages[0]
        registry: https://github.com/microsoft/vcpkg-docs
    The following redeclarations will be ignored:
        location: $.registries[1].packages[1]
        registry: https://github.com/vicroms/vcpkg-registry

Příklad č. 2: Přiřazení více vzorů k výchozímu registru

Výchozí registr můžete změnit dvěma způsoby. Nejprve definováním :"default-registry"

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
  }
}

Za druhé nastavením "default-registry" null vzoru v "registries" poli a jeho použitím"*":

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*"]
    }
  ]
}

Výhodou druhého formuláře je, že do pole balíčků můžete přidat další položky, zatímco "default-registry" objekt neumožňuje definovat pole balíčků vůbec. Tento rozdíl je důležitý v případech, kdy potřebujete zajistit, aby balíček pochází z výchozího registru.

Pojďme se podívat na registr, který poskytuje knihovny Qt Framework.

vcpkg-configuration.json

{
  "default-registry": {
    "kind": "git",
    "repository": "https://github.com/Microsoft/vcpkg",
    "baseline": "7e7c62d863b1bf599c1d104b76cd8b74475844d4"
  },
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

A následující závislosti projektu:

vcpkg.json

{
  "dependencies": [
    "qt5",
    "qt-advanced-docking-system",
    "qtkeychain"
  ]
}

Vzor "qt*" odpovídá všem názvům portů v vcpkg.jsonsouboru . Ale je tu problém! Porty qt-advanced-docking-system a qtkeychain nejsou součástí oficiálních knihoven Qt Framework a protože vcpkg nebude moct najít porty ve vlastním registru, instalace se nezdaří.

Tento postup je možné opravit přiřazením těchto balíčků k výchozímu registru. Toho dosáhneme tak, že změníme způsob, jakým deklarujeme výchozí registr a přidáme qt-advanced-docking-system ho do qtkeychain jeho "packages" pole:

vcpkg-configuration.json

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
      "packages": ["*", "qt-advanced-docking-system", "qtkeychain"]
    },
    {
      "kind": "git",
      "repository": "https://github.com/custom-qt/custom-qt-registry",
      "baseline": "adfc4de488094a384ca2c202b923ccc097956e0c",
      "packages": ["qt*"]
    }
  ]
}

Vzhledem k tomu, že přesné shody jsou upřednostňované před shodami vzorů, qt-advanced-docking-system a qtkeychain přeloží se na výchozí registr.

Překryvné porty

Překryvné porty představují způsob, jak rozšířit vcpkg o další porty bez vytvoření úplného registru. Překryvné vrstvy se považují za před všemi aspekty vyhledávání registru nebo aspekty správy verzí. Překryvné vrstvy nahrazují všechny předdefinované trojité nebo porty. Další informace najdete v překryvných portech .

Překryvné porty se vyhodnocují v tomto pořadí:

  1. Překrytí z příkazového řádku --overlay-ports v předaném pořadí;
  2. Překryvy z vcpkg-configuration.json"overlay-ports" v pořadí;
  3. Překrytí z VCPKG_OVERLAY_PORTS proměnné prostředí v pořadí.

Překryvné trojky

Překryvné triplety představují způsob, jak rozšířit vcpkg o další triplety, aniž byste museli upravovat instalační adresář vcpkg. Překryvné vrstvy se považují za předdefinované trojité.

Překryvné triplety se vyhodnocují v tomto pořadí:

  1. Překrytí z příkazového řádku v předaném pořadí;
  2. Překryvy z vcpkg-configuration.json v pořádku; potom
  3. Překrytí z VCPKG_OVERLAY_TRIPLETS proměnné prostředí v pořadí.