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 sonraki manifesto:

{
    "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 bile A 1.2, 1.1 üzerinde herhangi bir kısıtlama olmadığından, vcpkg mümkün olan en düşük sürümü seçer.
  • B 1.0, A 1.1 tarafından geçişli olarak gereklidir.
  • C 3.0, A 1.1 tarafından eklenen geçiş kısıtlamasıyla yükseltilmiştir, böylece sürüm kısıtlamaları karşılanır.

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: overrides bildirimleri kullanılarak üst düzey manifestoda 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ılma seçeneğinde sürümü belirleyin.
    • Yoksa:
      • Önceki bir sürüm seçilmemişse.
        • 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ılabilir değilse. Ö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.
        • Yoksa:
          • Önceki seçimi koru.
  • Planı gözden geçirin:
    • Çakışma yoksa
      • Seçili paketleri yükleme
    • Yoksa:
      • Ç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ı versions/{first letter of port name}-/{port name}.json içinde yer almalı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 dosya versions/baseline.json içinde bulunur.