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.

Bindirmeler

Yer paylaşımları, tam kayıt defteri oluşturmadan vcpkg'yi ek bağlantı noktaları ve ek üçlülerle genişletmenin bir yoludur. Katmanlar, herhangi bir kayıt defteri araması veya sürüm oluşturma işlemi gerçekleştirmeden önce dikkate alınır ve yerleşik üçlü veya bağlantı noktalarının yerini alır. Daha fazla bilgi edinmek için bkz . yer paylaşımı bağlantı noktaları .

Katman ayarları şu sırada 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şkenlerinden VCPKG_OVERLAY_[PORTS|TRIPLETS] sırayla yer paylaşımları .