Sürüm oluşturma kavramları

En düşük sürüm oluşturma

vcpkg, Go tarafından kullanılandan ilham alan ancak bazı şekillerde değiştirilen sürüm oluşturma için en düşük seçim yaklaşımını kullanır:

  • Her zaman yeni bir yüklemeden başlar, yükseltme/düşürme işlemleri gereksinimini ortadan kaldırır.
  • Temelleri tanıtarak kısıtlanmamış bağımlılıklara izin verin.

Ancak en düşük seçim ilkesi aynı kalır. Bir dizi kısıtlama göz önüne alındığında, vcpkg tüm kısıtlamaları karşılayabilen paketlerin "en eski" olası sürümlerini kullanır.

En düşük sürüm yaklaşımının kullanılması aşağıdaki avantajlara sahiptir:

  • Tahmin edilebilir ve anlaşılması kolaydır.
  • Yükseltmelerin ne zaman gerçekleştiğini kullanıcı denetler; örneğin, yeni bir sürüm yayımlandığında hiçbir yükseltme otomatik olarak gerçekleştirilmez.
  • SAT çözücü kullanmaktan kaçınıyor.

Bir örnek vermek için aşağıdaki paket grafiğini göz önünde bulundurun:

    (A 1.0) -> (B 1.0)

    (A 1.1) -> (B 1.0) 
            -> (C 3.0) 

    (A 1.2) -> (B 2.0)
            -> (C 3.0)

    (C 2.0)

Ve aşağıdaki bildirim:

{
    "name": "example",
    "version": "1.0.0",
    "dependencies": [ 
        { "name": "A", "version>=": "1.1" },
        { "name": "C", "version>=": "2.0" }
    ], 
    "builtin-baseline": "<some git commit with A's baseline at 1.0>"
}

Geçişli bağımlılıkları hesapladıktan sonra aşağıdaki kısıtlamalar kümesine sahibiz:

  • A >= 1.1
    • B >= 1,0
    • C >= 3.0
  • C >= 2,0

vcpkg'nin tüm kısıtlamaları karşılaması gerektiğinden, yüklü paket kümesi şöyle olur:

  • A 1.1, mevcut olsa A 1.2 bile, vcpkg'nin mümkün olan en düşük sürümü seçmesinden daha 1.1 yüksek bir kısıtlama yoktur.
  • B 1.0, tarafından A 1.1geçişli olarak gereklidir.
  • C 3.0, sürüm kısıtlamalarını karşılamak için tarafından eklenen geçiş kısıtlaması tarafından B 1.0 yükseltilir.

Kısıtlama çözümlemesi

Sürümlenmiş bağımlılık kümesine sahip bir bildirim verildiğinde, vcpkg tüm kısıtlamaları karşılayan bir paket yükleme planı hesaplamayı dener.

Sürüm kısıtlamaları aşağıdaki türlerde gelir:

  • Bildirilen kısıtlamalar: kullanılarak version>=üst düzey bildirimde açıkça bildirilen kısıtlamalar.
  • Temel kısıtlamalar: tarafından örtük olarak builtin-baselineeklenen kısıtlamalar.
  • Geçişli kısıtlamalar: Bağımlılıklarınızın bağımlılıkları tarafından dolaylı olarak eklenen kısıtlamalar.
  • Geçersiz kılınan kısıtlamalar: Bildirimler kullanılarak overrides üst düzey bildirimde geçersiz kılınan kısıtlamalar.

Bir yükleme planını hesaplamak için vcpkg kabaca şu adımları izler:

  • Plana tüm üst düzey kısıtlamaları ekleyin.
  • Plana özyinelemeli olarak geçişli kısıtlamalar ekleyin.
    • Plana her yeni paket eklendiğinde, plana temel kısıtlamasını da ekleyin.
    • Her kısıtlama eklendiğinde:
    • Paket için bir geçersiz kılma varsa
      • Geçersiz kılmada sürümü seçin.
    • Aksi takdir -de:
      • Seçili önceki sürüm yoksa.
        • Kısıtlamayı karşılayan en düşük sürümü seçin.
      • Seçili önceki bir sürüm varsa:
        • Yeni kısıtlamanın sürüm oluşturma düzeni daha önce seçilen sürümle eşleşmiyorsa:
          • Sürüm çakışması ekleyin.
        • Kısıtlamanın sürümü daha önce seçilen sürümle karşılaştırılamazsa. Örneğin, "version-string: apple" ile "version-string: orange" karşılaştırması:
          • Sürüm çakışması ekleyin.
        • Kısıtlamalar sürümü daha önce seçilen sürümden yüksekse:
          • En yüksek sürümü seçin.
        • Aksi takdir -de:
          • Önceki seçimi koru.
  • Planı gözden geçirin:
    • Çakışma yoksa
      • Seçili paketleri yükleme
    • Aksi takdir -de:
      • Çakışmaları kullanıcıya bildirme

Bağlantı noktası sürümlerini alma

Paket sürümleri kavramı her zaman vcpkg'de mevcut olsa da, sürüm kısıtlamaları kavramı mevcut değildir.

Sürüm oluşturma kısıtlamalarının kullanıma sunulmasıyla birlikte, bir paketin yerel olarak kullanılabilir olanla eşleşmeyen bir bağlantı noktası sürümüne bağımlı olması artık mümkündür. Vcpkg'nin istenen sürüm için bağlantı noktası dosyalarını nasıl edineceklerini bilmesi gerektiğinden bu bir sorun oluşturur.

Bu sorunu çözmek için yeni bir meta veri dosyası kümesi kullanıma sunulmuştur. Bu dosyalar vcpkg deposunun kök düzeyinde dizinde bulunur versions/ .

versions/ dizini, kayıt defterinde bulunan bağlantı noktalarından her biri için JSON dosyalarını içerir. Her dosya, bir paket için kullanılabilen tüm sürümleri listeler ve vcpkg'nin bu sürümün portfile'larını almak için kullanıma alabildiği bir Git tree-ish nesnesi içerir.

Örnek: zlib.json

{
  "versions": [
    {
      "git-tree": "2dfc991c739ab9f2605c2ad91a58a7982eb15687",
      "version-string": "1.2.11",
      "port-version": 9
    },
    ...
    {
      "git-tree": "a516e5ee220c8250f21821077d0e3dd517f02631",
      "version-string": "1.2.10",
      "port-version": 0
    },
    {
      "git-tree": "3309ec82cd96d752ff890c441cb20ef49b52bf94",
      "version-string": "1.2.8",
      "port-version": 0
    }
  ]
}

Her bağlantı noktası için ilgili sürüm dosyası içinde versions/{first letter of port name}-/{port name}.jsonbulunmalıdır. Örneğin, zlib'in sürüm dosyası içinde versions/z-/zlib.jsonbulunur. Bağlantı noktası sürüm dosyalarının yanı sıra, geçerli temel dosyası içinde versions/baseline.jsonbulunur.