Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Go Projesini Derlemek

2 min read

Go programlama dili ile proje geliştirmeye başladınız diyelim, mesela bir web projesi. Her şey tamamlandığınızda aklınıza şimdi bunu nasıl yayına alacağım sorusu gelecektir. İşte bu noktada derleme işlemine geçilmektedir ve birkaç püf noktanın bilinmesi gerekir.

Öncelikle dikkat edilmesi gereken ilk konu derleyip deploy edeceğiniz yerdeki go sürümü ile deploy edeceğiniz yerdeki go sürümünün aynı olduğundan emin olmak. Bu nedenle apt install go gibi standart komutları kullanmak yerine aşağıdaki şekilde kurulum yapmanız gerekecektir.

Go Kurulumu

cd /tmp
wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
sudo tar -xvf go1.11.linux-amd64.tar.gz
sudo mv go /usr/local

Ardından shell profil dosyanızda ( .bashrc, .bash_profile, .zshrc vb.) aşağıdaki şekilde GOPATH tanımlaması yapmanız gerekmektedir.

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

Söz konusu değişikliğin etkili olabilmesi için aşağıdaki komutu kullanabilirsiniz.

source ~/.bashrc

Go kurulumunun tamamlanması için gereken son adım üzerinde çalışma yapacağınız go klasörlerinin oluşturulmasıdır.

mkdir -p ~/go/{pkg,src,bin}

Go Projesini Derleme

Go projenizi derlemenin 2 yöntemi vardır.

  • go install <klasör ismi> : Üzerinde çalıştığınız klasörü bu komut ile derleyebilirsiniz. Bu komut için proje klasörünün bir üst dizininde olmanız gerekmektedir. Bu işlem sonucunda derlenmiş olan dosya /go/bin klasöründe oluşacaktır.
  • go build : Bu komut ile projenizi derlediğiniz zaman proje klasörünün içinde yani dosya.go ile aynı dizinde derlenmiş olan dosyayı bulabilirsiniz. Bu komutu çalıştırmak için projenizin main fonksiyonunun bulunduğu dosya ile aynı dizinde olmanız ve o go dosyasını derlemeniz gerekmektedir.

 

Cross Compile İşlemi

Cross compile, derleme yapılacak ortam ile uygulamanın çalıştırılacağı ortamın (işletim sisteminin) farklı olduğu durumlarda ortaya çıkmaktadır. Buradaki önemli nokta şu: Deploy edeceğiniz go dosyası eğer farklı bir işletim sisteminde çalışacaksa yani cross compile işlemi yapacaksanız, derleme esnasında hedefteki işletim sisteminde bulunan go değişkenlerinden GOARCH ve GOOS değişkenlerinin değerlerini bilmeniz ve derleme esnasında bu parametreleri girmeniz gerekmektedir.

Örnek: Benim işletim sistemim MacOS ve go env komutu ile go değişkenlerini görüntülediğimde söz konusu değişkenlerin GOARCH=”amd64″ ve GOOS=”darwin” şeklinde olduğunu görüyorum.
Hedefteki işletim sistemim olan Ubuntu 16.04’te ise aynı değişkenlerin GOARCH=”amd64″ ve GOOS=”linux” şeklinde olduğunu görüyorum.

Build komutu ile cross compile işlemi yapacağım zaman komutu aşağıdaki şekilde çalıştırıyorum:

env GOOS=linux GOARCH=amd64 go build hello.go

go install vs. go build?

Cross compile esnasında go install yerine go build tercih etmelisiniz. Bunun 2 önemli sebebi vardır.

  1. Cross compile işlemi yapabilmek için go değişkenlerinden GOBIN’in tanımlanmamış yani boş olması gerekmektedir yani şu şekilde: GOBIN=”” Eğer tanımlanmış ise ve cross compile komutunun sonunda go install kullanırsanız;
    go install: cannot install cross-compiled binaries when GOBIN is set

    gibi bir hata ile karşılaşırsınız. Ancak go build kullanırsanız böyle bir hata ile karşılaşmazsınız çünkü go build, derleme esnasında geçici olarak GOBIN’i tanımlanmamış (boş) olarak kabul ediyor. Bu nedenle cross compile işlemleri esnasında go build kullanmak mantıklı bir seçim olacaktır.

  2. go install her zaman derlenen paketleri /pkg dizininde kaynak kodun sonuna .a uzantısı ekleyerek ve kaynak kod dizini ile aynı şekilde önbellekleme (cache) işlemi yapar. Böyle bir durumda yazılabilir olmaması gereken (read only olmalı) /usr/local/go dizininde, /usr/local/go/pkg/$GOOS_$GOARCH şeklinde klasör oluşturmaya çalışır ve bu da hataya neden olur.
Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer