1. Go Modülleri ve Paket Yönetimi Temelleri
Go Modülleri, Go dilinin resmi paket yönetimi ve bağımlılık versiyon kontrol sistemi olup Go 1.11'den beri tanıtılmış ve Go 1.13'ten itibaren varsayılan bağımlılık yönetim mekanizması haline gelmiştir. Go Modülleri, her projeyi bir modül olarak ele alır; bu modül, projedeki Go kodunu ve bağımlı olduğu tüm paketleri içerir.
Çalışma Prensibi
Go Modülleri, projenin bağımlılıklarını go.mod
dosyası aracılığıyla yönetir. Bu dosya, projenin kök dizininde yer alır ve tüm doğrudan bağımlılıkları ve versiyonlarını listeler. Bir modül, genellikle bir depo olmasına rağmen birden çok paketi içerebilir.
Yapılandırma veya diğer komutları çalıştırırken eğer geçerli dizinde go.mod
dosyası bulunmuyorsa, Go araç takımı, geçerli işlem için modül bağlamını belirlemek için geçerli dizinde ve üst dizinlerinde go.mod
dosyasını arayacaktır. Bulunursa, bu dosyadaki bağımlılık bilgilerini alarak paketleri alacak ve derleyecektir; aksi takdirde, GOPATH modu altında bağımlılık yönetim yöntemini kullanacaktır.
Go Dilindeki Rolü
- Versiyon Kontrolü: Go Modülleri, geliştiricilere üçüncü taraf kütüphanelerinin belirli versiyonlarının kullanımını belirtme olanağı sağlayarak kodun yeniden üretilebilirliğini sağlar.
- Paket Yönetimi: Projelerin bağımlılıklarını ve versiyonlarını kolayca yönetir.
-
Modül İzolasyonu: Farklı projeler, her birinin kendi bağımlılıklarını yöneten
go.mod
dosyasına sahip olduğundan, aynı paketin farklı versiyonlarına bağlı olabilirler, çakışma olmadan.
Paket ve modül yönetimi, bağımlılık yönetimi, paket versiyon yükseltmeleri ve aşağı akış paket kullanıcıları için yeniden üretilebilir derlemeler gibi görevler, modern bir programlama dilinde önemli bir yönü oluşturur. Go dilinde, projeler ve bağımlılık ölçekleri arttıkça, Go Modülleri, bağımlılık yönetimi zorluklarına etkili bir şekilde çözüm sağlamak için gerekli bir mekanizma sunar.
2. Kendi Go Modülünü Oluşturma
Yeni bir Go modülünü oluşturmak oldukça basittir. Projenin kök dizininde aşağıdaki komutu çalıştırarak bunu yapabilirsiniz:
go mod init <modül-adı>
Burada <modül-adı>
genellikle kod deposunun adresi olup github.com/kullanıcıadı/repo
gibi bir adres olabilir.
go.mod
Dosyasının Amacı
go mod init
komutu başarıyla çalıştırıldığında, geçerli dizinde bir go.mod
dosyası oluşturulacaktır. Bu dosya aşağıdakileri tanımlar:
- Geçerli modülün adını.
- Go versiyonunu.
- Her paket için uygun versiyon dahil olmak üzere tüm doğrudan bağımlılıklarla ilgili gerekli bilgiler.
go.mod
dosyası, Go Modülleri mekanizmasındaki en kritik bileşendir ve bağımlılıklar eklendikçe veya kaldırıldıkça otomatik olarak güncellenecektir.
3. Go Paketleri Oluşturma ve Yapılandırma
3.1 Paket Oluşturmanın Temelleri
Go dilinde bir paket, genellikle aynı dizinde bulunan birden çok Go kaynak dosyasının bir koleksiyonudur ve belirli bir dizi işlevselliği içerir. Her Go dosyası, package
anahtar kelimesini kullanarak hangi pakete ait olduğunu belirtir.
Yeni bir paket oluşturmak için şunları yapmanız gerekir:
- Paketin dizinini temsil etmek için bir klasör oluşturun.
- Klasörde
.go
dosyaları oluşturun ve dosyanın ilk satırınapackage <paket-adı>
belirtin.
Paket adı genellikle dizin adıyla ilişkilidir, ancak aynı olmak zorunda değildir. Paket adı kısa, anlaşılır olmalı ve mümkünse alt çizgi kullanmaktan kaçınılmalıdır.
3.2 Paket Yapısı
Go paketlerinizi mantıklı bir şekilde yapılandırmak, kodun okunabilirliğini, bakımını ve yeniden kullanılabilirliğini sağlamak için oldukça önemlidir.
- Dizin Yapısı: Her bir dizinin bir paketi temsil ettiği, işlevselliğe göre dizinleri bölebilirsiniz.
-
İsimlendirme Kuralları:
_test
gibi dizinler tipik olarak test dosyalarını,cmd
dizini genellikle komut satırı uygulamaları için, veinternal
dizini dış kullanım için olmayan özel kodu içerir.
/kök-dizin
/pkg
/alt-paket1
alt-paket1.go
/alt-paket2
alt-paket2.go
/cmd
main.go // komut satırı uygulamaları için cmd dizini
/internal
yardımcı.go
Bu yapılandırılmış yaklaşım, kodun yapısını açıkça gösterir ve kodun yönetilmesini, test edilmesini ve derlenmesini kolaylaştırır. Bu şekilde iyi yapılandırılmış paketler, diğer projeler tarafından kolayca ithal edilip kullanılabilir.
Yukarıdaki yapısal ve isimlendirme kurallarına uyulması, diğer geliştiricilerin kod tabanının bileşimini hızlıca anlamalarına yardımcı olur, bu da daha etkili paket yönetimi ve bakımına yol açar.
4. Paketleri İçe Aktarma ve Kullanma
4.1 İç Paketleri İçe Aktarma
Aşağıdaki gibi bir proje yapınızın olduğunu varsayalım:
├── src
│ ├── main.go
│ └── mypackage
│ └── mymodule.go
Bu örnekte, mypackage
, içinde mymodule.go
adında bir dosya bulunan oluşturduğunuz bir iç pakettir. İlk olarak, mymodule.go
dosyasının doğru paket adını bildirdiğinden emin olun:
// mymodule.go
package mypackage
// SomeFunction, mypackage içindeki genel bir fonksiyondur
func SomeFunction() {
// Fonksiyonun implementasyonu
}
Şimdi, main.go
dosyasında mypackage
paketinden SomeFunction
'ı kullanmak istiyorsak, şunu içe aktarmamız gerekir:
// main.go
package main
import (
"fmt"
"project/src/mypackage"
)
func main() {
mypackage.SomeFunction()
fmt.Println("Fonksiyon çağrıldı")
}
Yukarıdaki import
ifadesi, mypackage
paketini main.go
dosyasına aktarır ve bize mypackage.SomeFunction
'ı kullanma imkanı verir.
4.2 Harici Paketleri Kullanma
Daha karmaşık işlevselliğe ihtiyaç duyduğumuzda, genellikle harici paketlere güveniriz. Harici paketler, diğer geliştiriciler tarafından yazılan ve kamuya açık olarak kullanılabilen paketlerdir ve kendi projelerimize kolayca entegre edebiliriz. Harici paketler bulmak için godoc.org gibi web sitelerini ziyaret edebilir veya GitHub'ta arama yapabilirsiniz.
Projende gorilla/mux
paketini kullanmak istediğinizi varsayalım, bu popüler bir HTTP istek yönlendirici kütüphanesidir. Paketi şu şekilde içe aktarabilir ve kullanabilirsiniz:
Öncelikle, go get
komutunu kullanarak paketi yükleyin:
go get -u github.com/gorilla/mux
Daha sonra, kodunuzda gorilla/mux
'ı içe aktarın ve kullanın:
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter() // Bir yönlendirici örneği oluştur
// Rota kurallarını ekle
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
w.Write([]byte("gorilla/mux'a hoş geldiniz!"))
})
// HTTP sunucusunu başlat
http.ListenAndServe(":8000", r)
}
Yukarıdaki kodda, gorilla/mux
'ı içe aktararak bir HTTP yönlendirici oluşturup, kök dizin için bir işleyici fonksiyon tanımlıyor ve nihayetinde http.ListenAndServe
ile 8000 numaralı portta sunucuyu başlatıyoruz.
5. Modül Bağımlılıklarını Yönetme
Büyük ölçekli bir projede, modül bağımlılıklarını yönetmek özellikle önemlidir. Bu, her derlemenin veya proje replikasının tutarlılık için aynı sürüm bağımlılıklarını doğru şekilde kullanmasına yardımcı olur.
5.1 go get
ile Bağımlılıkları Güncelleme
go get
komutu sadece yeni paket bağımlılıklarını eklemekle kalmaz, aynı zamanda mevcut olanları da günceller. go get
için bazı yaygın seçenekler aşağıda verilmiştir:
- Tek bir paketi güncelle:
go get -u github.com/some/package
- Bu paketin tüm bağımlılıklarını güncelle:
go get -u github.com/some/package/...
- Projedeki tüm bağımlılıkları güncelle:
go get -u ./...
- İndir, ancak kurma:
go get -d github.com/some/package
Güncelleme işlemleri gerçekleştirildiğinde, Go en son minör veya revizyon sürümüne (sembolik sürümlemeye dayalı olarak) günceller ve değişiklikler aynı zamanda go.mod
dosyasında da yansıtılır.
5.2 Sürüm Kontrolü ve go.mod
Go, 1.11 sürümünden itibaren Go Modülleri
adı verilen yeni bir bağımlılık yönetim sistemi sağlamaktadır. Projenin kök dizinindeki go.mod
dosyası, paketlerin bağımlılıklarını kaydeder.
go.mod
dosyası aşağıdaki bölümleri içerir:
- Module, mevcut projenin modül yolunu bildirir.
- Require, bağımlılıkları ve belirli sürümlerini belirtir.
- Replace, değiştirme modül yolunu ve sürümlerini belirtebilir.
- Exclude, belirli sürümleri hariç tutmak için kullanılır.
Bir go.mod
dosyasının örneği şöyle olabilir:
module github.com/my/awesome-project
go 1.14
require (
github.com/gorilla/mux v1.7.4
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975
)
replace (
github.com/old/dependency => github.com/new/dependency v1.2.3
)
exclude (
github.com/old/dependency v1.1.4
)
Proje içerisinde go build
veya go test
gibi komutları çalıştırırken, Go otomatik olarak go.mod
dosyasını oluşturacak veya güncelleyerek projenin gereksinim duyduğu tüm bağımlılıkları belirleyecektir. Sürüm kontrolünde en iyi uygulama, düzenli olarak go.mod
ve beklenen bağımlılık kriptografik hash'lerini kaydeden go.sum
dosyalarını commit etmektir.
go.mod
dosyası aracılığıyla yönetilerek, her geliştiricinin takım içinde aynı bağımlılık sürümlerini kullandığından emin olunur ve bu da "ama benim makinemde çalışıyor" durumunu önler.