Aracılığıyla paylaş


Paket adı çözümlemesi

vcpkg, ağa ulaşmadan önce her paket için sorumlu kayıt defterini (veya yer paylaşımını) belirler. Bu, ad çözümlemesi herhangi bir dış duruma bağlı olmadığından paket Bağımlılık karışıklığı saldırılarını önler.

Ad çözümleme algoritması adımları şunlardır:

  • Ad bir katmanda bulunursa bu katmanı kullanın; aksi takdirde
  • Bir "packages" bağlantı noktası adıyla eşleşen desen, bu kayıt defterini kullanın; yoksa
  • Varsayılan kayıt defteri değilsenull, bu kayıt defterini kullanın; aksi takdirde
  • Kayıt defterine bağlantı noktası çözümlenememesi.

Adla eşleşen birden çok "packages" desen olduğunda, vcpkg aşağıdaki gibi önceliklendirir:

  1. Tam eşleşme -- boost seçilir boost*
  2. En uzun desen -- boost* seçilir b*
  3. İlk eşleşme -- En iyi deseni belirten ilk kayıt defteri seçilir

Örnek #1: Paket adı çözümlemesi

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"
}

Bu yapılandırma göz önüne alındığında, her paket adı şu şekilde çözümlenecektir:

  • beicode: kayıt defterinden https://github.com/vicroms/vcpkg-registry (üzerinde tam eşleşme beicode)
  • beison: kayıt defterinden https://github.com/Microsoft/vcpkg-docs (dizide "registries" ilk olarak bildirilen ve üzerinde beison desen eşleşmesi)
  • fmt: varsayılan kayıt defterinden (eşleşme yok)

Birden çok kayıt defteri bildirdiğinden bei*, vcpkg bir uyarı da yayar:

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

Örnek 2: Varsayılan kayıt defterine birden çok desen atama

Varsayılan kayıt defterini iki şekilde değiştirebilirsiniz. İlk olarak, öğesini tanımlayarak "default-registry":

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

İkincisi, öğesini olarak ayarlayarak "default-registry" null ve dizideki deseni "*" "registries" kullanarak:

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

İkinci formun bir avantajı, packages dizisine daha fazla girdi ekleyebilmenizdir, "default-registry" ancak nesne bir paket dizisi tanımlamanıza hiç izin vermez. Bu fark, bir paketin varsayılan kayıt defterinden geldiğinden emin olmanız gereken durumlarda önemli hale gelir.

Qt Framework kitaplıklarını sağlayan bir kayıt defteri düşünelim.

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*"]
    }
  ]
}

Ve aşağıdaki proje bağımlılıkları:

vcpkg.json

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

Desen içindeki "qt*" tüm bağlantı noktası adlarında vcpkg.jsoneşleşir. Ama bir sorun var! ve qtkeychain bağlantı noktaları qt-advanced-docking-system resmi Qt Framework kitaplıklarının bir parçası değildir ve vcpkg özel kayıt defterindeki bağlantı noktalarını bulamayacağından yükleme başarısız olur.

Bunun yerine bu paketler varsayılan kayıt defterine atanarak bu düzeltilebilir. Bunu, varsayılan kayıt defterini bildirme şeklimizi değiştirerek ve dizinine "packages" ve qtkeychain ekleyerek qt-advanced-docking-system gerçekleştiririz:

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*"]
    }
  ]
}

Tam eşleşmeler desen qt-advanced-docking-system eşleşmeleri yerine tercih edildiğinden ve qtkeychain varsayılan kayıt defterine çözümlenir.

Katman bağlantı noktaları

Katman bağlantı noktaları, tam kayıt defteri oluşturmadan vcpkg'yi ek bağlantı noktalarıyla genişletmenin bir yoludur. Yer paylaşımları, kayıt defteri aramalarından veya sürüm oluşturma konusunda dikkat edilmesi gerekenlerden önce dikkate alınır. Yer paylaşımları yerleşik üçlülerin veya bağlantı noktalarının yerini alır. Daha fazla bilgi edinmek için bkz . yer paylaşımı bağlantı noktaları .

Katman bağlantı noktaları şu sırada değerlendirilir:

  1. Komut satırından --overlay-ports geçirilen sırayla yer paylaşımları; ardından
  2. Yer paylaşımları: vcpkg-configuration.json"overlay-ports" sırasıyla; ardından
  3. Ortam değişkeninden VCPKG_OVERLAY_PORTS sırayla yer paylaşımları.

Yer paylaşımlı üçlüler

Katman üçlüleri, vcpkg'nin yükleme dizinini değiştirmeden vcpkg'yi ek üçlülerle genişletmenin bir yoludur. Yer paylaşımları yerleşik üçüzlerden önce kabul edilir.

Yer paylaşımlı üçlüler şu sırayla değerlendirilir:

  1. Komut satırından geçirilen sırayla yer paylaşımları; ardından
  2. Yer paylaşımları: vcpkg-configuration.json sırayla; sonra
  3. Ortam değişkeninden VCPKG_OVERLAY_TRIPLETS sırayla yer paylaşımları.