Udostępnij za pośrednictwem


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 nullma 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:

  1. Dokładne dopasowanie -- boost jest wybierane boost*
  2. Najdłuższy wzorzec -- boost* jest wybierany za pośrednictwem b*
  3. 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 rejestru https://github.com/vicroms/vcpkg-registry (dokładne dopasowanie w obiekcie beicode)
  • beison: z rejestru https://github.com/Microsoft/vcpkg-docs (dopasowanie wzorca na beison 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.

Nakładki

Nakładki to sposób na rozszerzenie narzędzia vcpkg przy użyciu dodatkowych portów i dodatkowych trypletów bez tworzenia pełnego rejestru. Nakładki są brane pod uwagę przed wykonaniem jakichkolwiek wyszukiwań rejestru lub przechowywania wersji i zastąpią wszystkie wbudowane trojaczki lub porty. Zobacz porty nakładki, aby dowiedzieć się więcej.

Ustawienia nakładki są oceniane w następującej kolejności:

  1. Nakładki z wiersza polecenia w kolejności przekazanej; następnie
  2. Nakładki z vcpkg-configuration.json w kolejności; wtedy
  3. Nakładki ze VCPKG_OVERLAY_[PORTS|TRIPLETS] zmiennych środowiskowych w kolejności.