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 se název nachází v překryvné oblasti , použijte tento překryv; jinak
- Pokud existuje
"packages"
vzor, který odpovídá názvu portu, použijte tento registr; jinak - Pokud výchozí registr není
null
, použijte tento registr; jinak - Nepodařilo se přeložit port do registru.
Pokud existuje více "packages"
vzorů, které odpovídají názvu, vcpkg určuje prioritu následujícím způsobem:
- Přesná shoda --
boost
je vybrána.boost*
- Nejdelší vzor --
boost*
je zvolen nadb*
- 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 registruhttps://github.com/vicroms/vcpkg-registry
(přesná shoda dnebeicode
)beison
: z registruhttps://github.com/Microsoft/vcpkg-docs
(shoda vzorů abeison
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.json
souboru . 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í:
- Překrytí z příkazového řádku
--overlay-ports
v předaném pořadí; - Překryvy z
vcpkg-configuration.json
"overlay-ports"
v pořadí; - 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í:
- Překrytí z příkazového řádku v předaném pořadí;
- Překryvy z
vcpkg-configuration.json
v pořádku; potom - Překrytí z
VCPKG_OVERLAY_TRIPLETS
proměnné prostředí v pořadí.