Semantic Versiyonlama ve Minimal Version Selection Algoritması — Go 1.11 Modules 2. Bölüm

Bu yazıda nereden geliyor diye merak ediyorsanız, o zaman birinci bölümü okumanızı tavsiye ederim:

Kaldığımız yerden devam edelim. Modules: beraberce versiyonlanan Go paketleri demekti. Çoğu zaman Git gibi repolarda sakladığınız kodların hepsine bir Module diyebiliriz, ama bir repo içinde birden fazla module de saklamak mümkün. Eğer başka dillerden geliyorsanız, mesela .NET gibi, bunu .csproj ile tanımlanan bir proje olarak düşünebilirsiniz.

Go modüllerini anlarken, bilinmesi gereken diğer kavram, semantic versiyonlama. Semantic manasal demek. Dolayısıyla, bir versiyonlama yaparken kullandığınız sayıların ve bu sayıların yerlerinin bir manası var. Bu numaralara bakan insanlar, hangi yerde ki hangi sayının ne manaya geldiğini ve dolayısıyla ne beklemeleri gerektiğini bilecekler demektir.

Aslında yukarıda ki resim bu versiyonlama biçimini gayet anlaşılır biçimde gösteriyor ama İngilizce bilmeyen arkadaşlar için kısaca özetlemek gerekirse:

4.2.1 diye versiyonladığınız — ki bu şekilde bir versiyonlama takip etmeniz gerekiyor — bir projede 4 büyük versiyon, 2 küçük versiyon, ve 1 ise yama versiyonu demek. Büyük versiyon ciddi değişiklerin olduğunu ve bir önceki sistemle ile çalışmayacağı manasına geliyor. Yani eğer versiyon 3'ü kullanıyorsanız, kendi kodunuzda hiç bir değişiklik yapmadan versiyon 4'ü büyük bir ihtimal kullanamayacaksınız demektir. Küçük versiyon ise, sadece yeni özelliklerin eklendiğini ama kodunuzu bozacak değişiklikler yapılmadığını söylüyor. Son olarakta yama, yani patch, ise hataların giderildiğini ve onun dışında başka değişiklikler yapılmadığını söylüyor.

Go da yeni module özelliği işte bu semantic versioning olayını kullanıyor. Onun için bilmek önemliydi. Ama universal bir şey olduğundan kendi projeleriniz de bu versiyonlama tekniğini kullanabilirsiniz. Hatta bence sorun değilse, kesinlikle kullanın.

Hatırlarsanız, Go da indirilen paketler src klasörü altında tutuluyordu ve herhangi bir versiyonlamaya tabi değillerdi. Dolayısıyla Go mümkün mertebe daha önce indirdiği paketleri ona ihtiyaç duyan tüm paket ve projelerde kullanıyordu. Bunun hakkında daha detaylı bilgiyi bir önceki makalemde bulabilirsiniz.

Yeni versiyonlama ile bu olay değişti. Diyelim ki aşağıda ki gibi bir dependency durumu mevcut:

MyApp 1.9 > MarsLib 2.1 > WorldLib 3.1

Sonrasında MyApp içinde kullanılmak üzere başka bir paket daha indirdiniz ve dependency aşağıda ki gibi gözükmeye başladı:

MyApp 1.9 > JupiterLib 3.5 > WordLib 3.2

Dikkat ederseniz yeni JupiterLib paketi, WordLib paketinin 3.2 versiyonunu kullanıyor. Peki bu durumda MarsLib’in durumu ne olacak? Hala WordLib 3.1 versiyonunu mu kullanıyor olacak? Cevap hayır. Go sizin adınıza MarsLib içinde 3.2 versiyonunu kullanmaya devam edecek. Buna minimal version selection deniyor. Bu ifadeyi minimum ile karıştırmamak gerekiyor. Burada amaç ortak bir versiyon seçmek ve bu sayede aynı kütüphanenin onlarca versiyonu ile uğraşmak yerine, hepsinde çalışacak bir versiyon seçmeye çalışmak. Ama tabi bu her zaman çalışmayabilir. Çünkü minimal version selection algoritması, kullanılan versiyonlar içinden en yüksek versiyonu seçecek. Dolayısıyla, MarsLib içinde breaking değişiklikler gelebilir. Bu ne kadar mantıklı, ona başka bir yazıda değinmeye çalışalım.

Bir sonra ki yazımda görüşmek üzere…

Written by

Senior Manager in Software Engineering. Former Technical Lead. Author of the book: Hands-on with Go http://amzn.to/2QYFoaV YT: http://youtube.com/c/tarikguney

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store