Go 1.11 ile gelen yeni Module özelliği — 1. Bölüm

Module kavramını anlatmadan önce, Module ile ne çözülmek isteniyor sorusuna cevap verebilmek adına biraz genel kavramlardan başlamak lazım. Ama bu kısımları biliyorsanız, o zaman background kısmını direk atlayabilirsiniz. Bu makaleyi anlamak için aşağıda Go bilgilerini bilmeniz gerekiyor: Workspace kavramı, Go paketleri, Go CLI. Kısacası Go dilini hiç kullanmadıysanız, o zaman bu makaleyi çokta anlamayacaksınız.

Background

Başkalarının geliştirdikleri kütüphaneleri kullanmadan en basit uygulamaları bile neredeyse yazamadığımız zamanlardan geçiyoruz. Bundan dolayı her programlama dilinin belkide en önemli özelliği olarak karşımıza çıkıyor paketler. Paket (Package) ya da diğer bir ismi ile yeniden kullanılabilir kod üniteleri, örneğin kütüphaneler, hızlı ve güvenilir kod yazmak ve gelişen endüstride iş değeri olan ürünler çıkarmak için fazlasıyla dominant bir konsept. Farklı diller bunu farklı isim ve formatlarda sunuyorlar. Mesela, Java da .jar dosyaları, .NET ortamında .dll dosyaları, ve asıl konumuz olan Go programlama dilinde ise go get library-name demek suretiyle indirilen ve kendi kodunuza import ettiğiniz paketler. Çoğu zaman derlenmiş halde indirir ve kullanırsınız bu paketleri. Ama, Go diğer dillerden farklı olarak, derlenmiş kodu değil, kaynak kodları paket olarak indirir, indirdiği bu dosyalar src klasörü altına koyar. Derlemeyi hızlandırmak içinde bu kaynak kodları pkg klasörü altında object dosyaları olarak saklar.

Modules in Go

Module, versiyonlanmış kaynak kodları kümesi. .DLL ya da .JAR gibi düşünülebilir. Tabi farklılıkları var. Bu farklılıkların ne olduğunu ise bu yazı dizimde anlatmaya çalışacağım.

Problem

Go ilk çıktığından beri paketleri için native olarak versiyonlama desteği vermedi. Bu soruna cevap olması için araçlar geliştirenler oldu ama herkes tarafından kullanılan ortak çözümler olmadı. Sonrasında Go tarafından dep diye bir araç geliştirildi. Go 1.11 ile dep yerini vgo ya bırakmaya başladı. Bunların dışında Go içinde vendor özelliği vardı. Yani go get ile getirmek istemediğiniz paketleri, vendor klasörü altında saklıyordunuz. Bu da farklı vendorların kaynak kodlarının sizi kodunuz ile birlikte kaynak kod kontrol sistemlerinde saklanması demekti. Bu sayede versiyonlama sorunlarından bir nebze kurtulabiliyordunuz.

Çözüm

Versiyonlama. Go 1.11 ile Go CLI içinde destek verildi. Bir süredir vgo ile prototip olarak test ediliyordu. vgo, command line üzerinde çalıştırabilecek ayrı bir app. Go dan ayrı olarak indirip kullanmanız gerekiyordu. Artık onda ki özellikler go CLI içine entegre edildi ve dolayısıyla ayrı bir şekilde download edip kullanmanıza gerek yok. Ama unutmadan söyleyeyim, Go yazılımcıları hala bu modules sistemi üzerine çalışıyorlar ve ileride ufak bazı değişikler olabilir ama genel konseptin değişeceğini düşünmüyorum.

  1. Command line içinde GO111Module ortam değişkenine on değerini atayın.
  2. vgo uygulamasını indirip kullanın.
module github.com/my/module/v3

require (
github.com/some/dependency v1.2.3
github.com/another/dependency v0.1.0
github.com/additional/dependency/v4 v4.0.0
)

Peki nereden geliyor bu versiyon numaraları?

go get dediğiniz zaman paketler GitHub gibi yerlerden geliyor. Git reponuzda tag kullanarak istediğiniz commitlere versiyon verebiliyorsunuz. İşte, yeni versiyon numaraları buralardan geliyor.

Devamı Sonra

Buraya kadarki kısım Go modülleri hakkında kısa bir bilgi vermek içindi. Bundan sonra ki yazılarımda detaylara inerek yeni Modules sisteminin farklılıklarını ve nasıl çalıştığını daha derinlemesine incelemeye çalışacağız.

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