Ce face go build
go build compilează pachetul din directorul curent. Pentru un pachet main creează un executabil cu numele directorului (sau al modulului), iar cu -o alegi numele și locul. Pentru alte pachete doar verifică dacă se compilează, fără să scrie nimic. go build ./... compilează toate pachetele din modul.
Executabilul conține tot ce îi trebuie (inclusiv dependențele și runtime-ul Go), deci se copiază pe server și rulează fără să ai Go instalat acolo. Compilarea pentru alt sistem se face cu variabilele GOOS (linux, windows, darwin) și GOARCH (amd64, arm64), fără alte unelte.
Rezultatele intermediare sunt păstrate în cache, deci a doua compilare este mult mai rapidă. Opțiuni utile: -ldflags="-s -w" scoate informațiile de depanare (executabil mai mic), -ldflags="-X main.versiune=1.2.0" setează o variabilă la compilare, -race adaugă detectorul de data race, -trimpath scoate căile locale din executabil.
Parametri
| Parametru | Descriere |
|---|---|
-o |
Numele sau directorul executabilului. |
-ldflags |
Opțiuni pentru linker: -s -w (fără simboluri), -X pachet.var=valoare. |
GOOS / GOARCH |
Variabile de mediu pentru sistemul și procesorul țintă. |
-v / -x |
Afișează pachetele compilate / comenzile executate. |
Exemple
Exemplul 1: Compilare și rulare
go build
ls -lh magazin
./magazin
Rezultat în terminal
-rwxr-xr-x 1 ana staff 2.3M 19 oct 10:12 magazin
Preț final: 108.90 lei
Exemplul 2: Compilare pentru alte sisteme
Aceeași sursă, trei executabile; comanda file arată pentru ce sistem este fiecare.
GOOS=windows GOARCH=amd64 go build -o magazin.exe .
GOOS=linux GOARCH=amd64 go build -o magazin-linux .
go build -ldflags="-s -w" -o magazin-mic .
file magazin.exe magazin-linux
ls -l magazin-mic
Rezultat în terminal
magazin.exe: PE32+ executable (console) x86-64, for MS Windows
magazin-linux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=..., with debug_info, not stripped
-rwxr-xr-x 1 ana staff 1587714 19 oct 10:14 magazin-mic
Exemplul 3: Versiunea setată la compilare
-X schimbă valoarea unei variabile string de la nivel de pachet.
// main.go
package main
import "fmt"
var versiune = "dev"
func main() {
fmt.Println("magazin, versiunea", versiune)
}
// în terminal:
// go build -ldflags="-X main.versiune=1.4.0" -o magazin .
// ./magazin
Rezultat în terminal
magazin, versiunea 1.4.0
Greșeli frecvente
- Căutarea executabilului după
go build ./...: cu mai multe pachete nu se scrie niciun executabil, doar se verifică compilarea. - Compilarea pe Windows a unui program și copierea lui pe un server Linux: setează
GOOS=linux. - Programe cu cgo (
import "C") compilate pentru alt sistem: au nevoie de un compilator C pentru acel sistem sau deCGO_ENABLED=0.
Comenzi înrudite
go run: Compilează și rulează imediat un program Go, fără să lase un executabil în director.go install: Compilează un program și pune executabilul în directorul bin (GOBIN sau GOPATH/bin), ca să-l poți rula de oriunde.go clean: Șterge fișierele create de compilare și, cu opțiuni, cache-ul de build, de teste sau de module.go env: Afișează (și opțional salvează) variabilele de mediu și setările folosite de unealta go.go version: Afișează versiunea Go instalată sau versiunea cu care a fost compilat un executabil.