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 olsaA 1.2
bile, vcpkg'nin mümkün olan en düşük sürümü seçmesinden daha1.1
yüksek bir kısıtlama yoktur.B 1.0
, tarafındanA 1.1
geç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ındanB 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-baseline
eklenen 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.
- Yeni kısıtlamanın sürüm oluşturma düzeni daha önce seçilen sürümle eşleşmiyorsa:
- Seçili önceki sürüm yoksa.
- Planı gözden geçirin:
- Çakışma yoksa
- Seçili paketleri yükleme
- Aksi takdir -de:
- Çakışmaları kullanıcıya bildirme
- Çakışma yoksa
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}.json
bulunmalıdır. Örneğin, zlib'in sürüm dosyası içinde versions/z-/zlib.json
bulunur. Bağlantı noktası sürüm dosyalarının yanı sıra, geçerli temel dosyası içinde versions/baseline.json
bulunur.