Rozpoznawanie nazw pakietów
Narzędzie vcpkg określa odpowiedzialny rejestr (lub nakładkę) dla każdego pakietu przed dotarciem do sieci. Zapobiega to atakom polegającym na nieporozumianiu zależności pakietu, ponieważ rozpoznawanie nazw nie zależy od żadnego stanu zewnętrznego.
Kroki algorytmu rozpoznawania nazw to:
- Jeśli nazwa zostanie znaleziona w nakładce, użyj tej nakładki; w przeciwnym razie
- W przypadku wystąpienia
"packages"
wzorzec zgodny z nazwą portu, użyj tego rejestru; inaczej - Jeśli domyślny rejestr nie
null
ma wartości , użyj tego rejestru; w przeciwnym razie - Nie można rozpoznać portu w rejestrze.
Jeśli istnieje wiele "packages"
wzorców, które pasują do nazwy, priorytet vcpkg jest następujący:
- Dokładne dopasowanie --
boost
jest wybieraneboost*
- Najdłuższy wzorzec --
boost*
jest wybierany za pośrednictwemb*
- Pierwsze dopasowanie — pierwszy rejestr deklarujący najlepszy wzorzec jest wybierany
Przykład nr 1: rozpoznawanie nazw pakietów
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"
}
Biorąc pod uwagę tę konfigurację, każda nazwa pakietu jest rozpoznawana jako:
beicode
: z rejestruhttps://github.com/vicroms/vcpkg-registry
(dokładne dopasowanie w obiekciebeicode
)beison
: z rejestruhttps://github.com/Microsoft/vcpkg-docs
(dopasowanie wzorca nabeison
tablicy i zadeklarowane jako pierwsze w"registries"
tablicy)fmt
: z rejestru domyślnego (brak dopasowań)
Ponieważ wiele rejestrów deklaruje bei*
, vcpkg będzie również emitować ostrzeżenie:
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
Przykład nr 2: Przypisywanie wielu wzorców do rejestru domyślnego
Rejestr domyślny można zmienić na dwa sposoby. Najpierw należy zdefiniować element "default-registry"
:
{
"default-registry": {
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3"
}
}
Po drugie, ustawiając "default-registry"
wartość na null
i używając "*"
wzorca w tablicy "registries"
:
{
"default-registry": null,
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "e79c0d2b5d72eb3063cf32a1f7de1a9cf19930f3",
"packages": ["*"]
}
]
}
Zaletą drugiego formularza jest to, że można dodać więcej wpisów do tablicy packages, podczas gdy "default-registry"
obiekt nie pozwala na definiowanie tablicy pakietów w ogóle. Ta różnica staje się ważna w przypadkach, w których należy upewnić się, że pakiet pochodzi z rejestru domyślnego.
Rozważmy rejestr, który udostępnia biblioteki platformy 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 następujące zależności projektu:
vcpkg.json
{
"dependencies": [
"qt5",
"qt-advanced-docking-system",
"qtkeychain"
]
}
Wzorzec "qt*"
pasuje do wszystkich nazw portów w pliku vcpkg.json
. Ale jest problem! qt-advanced-docking-system
Porty i qtkeychain
nie są częścią oficjalnych bibliotek platformy Qt, a ponieważ program vcpkg nie będzie mógł znaleźć portów w rejestrze niestandardowym, instalacja zakończy się niepowodzeniem.
Można to naprawić, przypisując te pakiety do domyślnego rejestru.
Możemy to osiągnąć, zmieniając sposób deklarowania domyślnego rejestru i dodawania qt-advanced-docking-system
jej qtkeychain
do tablicy "packages"
:
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*"]
}
]
}
Ponieważ dokładne dopasowania są preferowane w przypadku dopasowań wzorca i qt-advanced-docking-system
qtkeychain
zostaną rozpoznane jako rejestr domyślny.
Porty nakładki
Porty nakładki to sposób rozszerzania narzędzia vcpkg przy użyciu dodatkowych portów bez tworzenia pełnego rejestru. Nakładki są brane pod uwagę przed wszelkimi odnośnikami rejestru lub zagadnieniami dotyczącymi przechowywania wersji. Nakładki zastępują wszystkie wbudowane trojaczki lub porty. Zobacz porty nakładki, aby dowiedzieć się więcej.
Porty nakładki są oceniane w następującej kolejności:
- Nakładki z wiersza
--overlay-ports
polecenia w kolejności przekazanej; następnie - Nakładki z
vcpkg-configuration.json
"overlay-ports"
w kolejności; następnie - Nakładki ze zmiennej środowiskowej
VCPKG_OVERLAY_PORTS
w kolejności.
Potrójne nakładki
Potrójne nakładki to sposób na rozszerzenie narzędzia vcpkg z dodatkowymi trojakami bez modyfikowania katalogu instalacyjnego programu vcpkg. Nakładki są brane pod uwagę przed wszelkimi wbudowanymi trojakami.
Trójkropki nakładki są oceniane w następującej kolejności:
- Nakładki z wiersza polecenia w kolejności przekazanej; następnie
- Nakładki z
vcpkg-configuration.json
w kolejności; wtedy - Nakładki ze zmiennej środowiskowej
VCPKG_OVERLAY_TRIPLETS
w kolejności.