Menu

go run, go build ve go install: Go'yu Derlemek ve Çalıştırmak

go run, go build ve go install'un her birinin ne yaptığı, Go'nun binary'yi nasıl adlandırdığı, GOOS ve GOARCH ile çapraz derleme ve commit etmeden önce çalıştırılacak go fmt ve go vet kontrolleri.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

go run bir programı tek adımda derleyip çalıştırır ve binary tutmaz. go build derler ve mevcut dizinde bir çalıştırılabilir dosya bırakır. go install derler ve çalıştırılabilir dosyayı $HOME/go/bin içine koyar. Üçü de doğal makine koduna derler; hiçbiri bir şeyi yorumlamaz.

KomutDerlerÇalıştırırBinary tutarBinary nereye gider
go run .evetevethayırgeçici dizin, sonra silinir
go buildevethayırevetmevcut dizin (ya da -o path)
go installevethayırevet$GOBIN, yoksa $GOPATH/bin

Aşağıdaki program bu sayfadaki örneklerde kullanılan programdır. Editör onu go run'ın çalıştıracağı şekilde çalıştırır.

go run

go run bir paket (genellikle mevcut dizin olan .) ya da bir .go dosyası listesi alır:

go run .
go run main.go
go run ./cmd/server

Paketten sonraki her şey programınıza argüman olarak aktarılır:

go run . --port 8080 verbose
version: dev
built for: linux/amd64
args: [--port 8080 verbose]

go run main.go yerine go run .'ı tercih edin. Bir dosya adı vermek yalnızca o dosyayı derler, bu yüzden paketin ikinci bir dosyası olduğu anda orada tanımlanan fonksiyonlar undefined olarak raporlanır. Paketler ve import'lar sayfası bu hatayı ayrıntılı anlatıyor.

go run ayrıca uzak bir programı belirli bir sürümde kurmadan çalıştırır; bu da kod üreteçleri için kullanışlıdır:

go run golang.org/x/tools/cmd/stringer@v0.30.0 -type=Color

go build

go build mevcut dizindeki paketi derler. Bir main paketi için bir çalıştırılabilir dosya yazar; bir kütüphane paketi için derler, hataları bildirir ve sonucu atar.

go mod init example.com/hello
go build
ls
go.mod  hello  main.go

Binary'nin adı şu kurallara uyar:

ÇalıştırdığınızBinary adı
example.com/hello modülünde go buildhello
go build ./cmd/serverserver
go build main.gomain (ilk dosyanın adıyla)
go build -o bin/app .bin/app
yukarıdakilerin herhangi biri GOOS=windows ileaynı ad artı .exe

Sürekli kullanacağınız iki biçim daha:

go build ./...      # compile every package in the module
go vet ./...        # static checks, covered below

./..., "bu dizin ve altındaki her dizin" demektir. Birkaç main paketiyle go build ./... hiç binary yazmaz; hızlı bir "her şey derleniyor mu" kontrolüdür.

Kullanışlı build bayrakları

BayrakNe yapar
-o nameçıktı dosyası ya da dizini
-vderlenirken paket adlarını yazdırır
-racedata race detector ile derler (daha yavaş, daha büyük binary; test için)
-trimpathyeniden üretilebilir derlemeler için yerel dosya sistemi yollarını binary'den kaldırır
-ldflags "-s -w"sembol tablosunu ve DWARF hata ayıklama bilgisini çıkararak binary'yi küçültür
-ldflags "-X main.version=1.4.0"link zamanında bir string değişkeni ayarlar
-tags namebir //go:build name kısıtıyla korunan dosyaları dahil eder

-X bayrağı çoğu Go projesinin binary'ye bir sürüm damgalama yoludur. Yalnızca paket seviyesindeki string değişkenler üzerinde çalışır (sabitlerde değil):

go build -o app -ldflags "-X main.version=1.4.0" .
./app
version: 1.4.0
built for: linux/amd64
args: []

Binary ayrıca modül sürümlerini ve Go 1.18'den beri derlendiği VCS commit'ini kaydeder. go version -m ./app bunları yazdırır, bir program ise runtime/debug.ReadBuildInfo ile okuyabilir.

go install

go install, tam olarak go build gibi derler ve sonra çalıştırılabilir dosyayı $GOBIN'e ya da GOBIN ayarlı değilse $GOPATH/bin'e (varsayılan olarak $HOME/go/bin) taşır:

go install .
go env GOPATH

En yaygın kullanımı Go ile yazılmış araçları kurmaktır. @version ile bir programı go.mod'unuza dokunmadan kurar:

go install golang.org/x/tools/gopls@latest
go install honnef.co/go/tools/cmd/staticcheck@latest

Kabuk sonrasında bir aracı bulamıyorsa $HOME/go/bin PATH'inizde değildir. Kabuk profilinize export PATH=$PATH:$(go env GOPATH)/bin ekleyin.

GOOS ve GOARCH ile Çapraz Derleme

Go, ek bir araç zinciri olmadan herhangi bir makineden başka bir işletim sistemi ya da CPU için derleyebilir. Derleme komutu için iki ortam değişkeni ayarlayın:

GOOS=linux GOARCH=amd64 go build -o app-linux-amd64 .
GOOS=linux GOARCH=arm64 go build -o app-linux-arm64 .
GOOS=darwin GOARCH=arm64 go build -o app-macos .
GOOS=windows GOARCH=amd64 go build -o app.exe .

PowerShell'de ortam değişkenleri farklı ayarlanır:

$env:GOOS = "linux"; $env:GOARCH = "amd64"; go build -o app-linux .

En yaygın çiftler:

GOOSGOARCHHedef
linuxamd64çoğu sunucu ve container
linuxarm64AWS Graviton, 64 bit işletim sistemli Raspberry Pi
darwinarm64Apple Silicon Mac'ler
darwinamd64Intel Mac'ler
windowsamd6464 bit Windows
jswasmtarayıcıda WebAssembly

go tool dist list desteklenen her çifti yazdırır (Go 1.24'te 48 tane).

Çapraz derleme yalnızca saf Go kodu için bu kadar kolaydır. cgo kullanan bir paket (C kodu, örneğin bazı SQLite sürücüleri) hedef için bir C çapraz derleyicisi ister. Çapraz derlerken cgo varsayılan olarak kapalıdır ve CGO_ENABLED=0'ı açıkça ayarlamak size ayrıca tamamen statik bir Linux binary'si verir; minimal bir scratch ya da distroless container imajında istediğiniz de budur.

go fmt ve go vet

Her iş akışına ve CI'a iki kontrol aittir.

go fmt dosyaları tek resmi stilde yeniden yazar: tab'lar, hizalanmış alanlar, düzenlenmiş boşluklar. gofmt -l -w'nin bir sarmalayıcısıdır:

go fmt ./...
gofmt -l .     # list files that are not formatted; empty output means clean

go vet derlenen ama neredeyse kesinlikle yanlış olan kodu raporlar. Printf format uyuşmazlıkları klasik örnektir:

package main

import "fmt"

func main() {
	count := 3
	fmt.Printf("%s items\n", count)
}
go vet ./...
# example.com/hello
# [example.com/hello]
./main.go:7:2: fmt.Printf format %s has arg count of wrong type int

Program derlenir ve %!s(int=3) items yazdırır; vet'in yakalamak için var olduğu hata tam olarak budur. Diğer vet kontrolleri arasında bir sync.Mutex'i değerle kopyalamak, erişilemeyen kod, söz dizimi hatalı struct tag'leri ve hiç çağrılmayan bir context.CancelFunc vardır. go test bu kontrollerin bir alt kümesini otomatik olarak çalıştırır; go build hiçbirini çalıştırmaz.

Diğer go Alt Komutları

KomutAmaç
go test ./...testleri çalıştırmak
go mod tidyeksik bağımlılıkları eklemek ve kullanılmayanları kaldırmak
go get pkg@versionbir bağımlılık eklemek ya da değiştirmek
go clean -cachebuild önbelleğini boşaltmak
go envGo'nun yapılandırmasını yazdırmak
go doc fmt.Printlndokümantasyonu terminalde göstermek
go list -m allderlemedeki her modülü listelemek

Derlemeler Neden İkinci Seferde Hızlıdır

Go derlenmiş paketleri build önbelleğinde (go env GOCACHE) saklar. Yeniden derleme yalnızca kaynağı ya da bağımlılıkları değişen paketleri yeniden derler, bu yüzden değişmemiş bir projede go run . neredeyse anında başlar. Go sürümlerini ya da ortam değişkenlerini değiştirdikten sonra bir derleme tuhaf davranırsa go clean -cache onu temizler; buna nadiren ihtiyacınız olur.

Sıkça Sorulan Sorular

go run ile go build arasındaki fark nedir?

go run programı geçici bir dizine derler, çalıştırır ve binary'yi atar. go build programı derler ve binary'yi mevcut dizine yazar, böylece onu tekrar çalıştırabilir ya da başka bir yere kopyalayabilirsiniz. Geliştirirken go run, çalıştırılabilir dosyaya ihtiyacınız olduğunda go build kullanın.

go build'in çıktı dosyası adı nasıl ayarlanır?

-o kullanın: go build -o myapp ., myapp yazar (Windows'ta -o myapp.exe'yi kendiniz yazın). -o olmadan go build binary'yi paketin import yolunun son elemanına ya da .go dosyaları verdiğinizde ilk dosyaya göre adlandırır ve Windows için derlerken .exe ekler.

Go, Linux ya da Windows için nasıl çapraz derlenir?

Derleme için GOOS ve GOARCH'ı ayarlayın: GOOS=linux GOARCH=amd64 go build -o app-linux . ya da GOOS=windows GOARCH=amd64 go build . (bu bir .exe üretir). Saf Go kodu için ek bir araç zinciri gerekmez. go tool dist list desteklenen her çifti yazdırır.

go install binary'yi nereye koyar?

Ayarlıysa $GOBIN'e, değilse varsayılan olarak $HOME/go/bin olan $GOPATH/bin'e. Kurulu araçları adlarıyla çalıştırmak için bu dizini PATH'inize ekleyin. go install example.com/tool@latest bir aracı modülünüze eklemeden kurar.

go build, go vet'i çalıştırır mı?

Hayır. go build yalnızca derler. go test, go vet kontrollerinin bir alt kümesini otomatik olarak çalıştırır, ama tam küme için go vet ./...'i kendiniz çalıştırın; genellikle CI'da gofmt -l . ile birlikte.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA