CLI yang sudah selesai menghasilkan binary mandiri: seluruh kode, dependency, dan runtime Go terbungkus dalam satu berkas tanpa installer, tanpa interpreter, dan tanpa daftar prasyarat. Karakter inilah yang membuat alat seperti kubectl dan hugo cukup didistribusikan dengan satu unduhan. Pada chapter terakhir section ini kita akan memasang program sendiri lewat go install, mengompilasinya untuk Windows dan macOS dari satu mesin Linux, lalu melihat praktik pelengkap: nomor versi, checksum, dan penyertaan aset statis.

go install dan GOBIN #

Perintah go install mengompilasi paket utama lalu menaruh hasilnya di satu direktori khusus. Lokasi tersebut ditentukan variabel GOBIN; bila kosong, binary jatuh ke $GOPATH/bin (biasanya ~/go/bin) yang umumnya sudah terdaftar di PATH. Periksa pengaturan aktif dengan go env GOBIN.

Bentuk paling populer dari go install memakai alamat module dengan versi, misalnya go install example.com/[email protected]; bentuk ini mengunduh module terpublikasi langsung dari internet tanpa berkas sumber di komputer lokal. Untuk melihat mekanismenya tanpa jaringan, kita pakai module lokal bernama sapa yang berisi versi-demo.go dari bundle bawah halaman:

bash
mkdir sapa && cd sapa
go mod init example.com/sapa
cp versi-demo.go main.go
mkdir -p /tmp/gobin-demo
GOBIN=/tmp/gobin-demo go install .
ls /tmp/gobin-demo
/tmp/gobin-demo/sapa

Output yang Dihasilkan:

text
go: creating new go.mod: module example.com/sapa
sapa
sapa v1.2.0
runtime : go1.27.2
platform: linux/amd64

Perhatikan hasil ls: nama binary mengikuti nama paket utama (atau nama akhir alamat module), bukan nama berkas main.go. Setelah terpasang, binary dapat dipanggil dari mana saja selama direktori GOBIN-nya berada di PATH — cara inilah yang dipakai pengguna memasang ribuan alat Go dengan satu baris perintah.

Cross-Compile dengan GOOS dan GOARCH #

Kompilasi silang hanya butuh dua variabel lingkungan: GOOS menentukan sistem operasi tujuan dan GOARCH menentukan arsitektur prosesor. Tabel berikut merangkum kombinasi yang paling sering dibutuhkan:

GOOSGOARCHTarget
linuxamd64Server x86-64
windowsamd64Windows 64-bit
darwinarm64MacBook M-series
darwinamd64MacBook Intel

Kompiler Go yang kita pakai di Linux mampu menghasilkan keempatnya tanpa toolchain tambahan. Berkas versi-demo.go di bawah menjadi kelinci percobaan; program mencetak versi, versi runtime, dan platform hasil kompilasi:

go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("sapa v1.2.0")
	fmt.Println("runtime :", runtime.Version())
	fmt.Println("platform:", runtime.GOOS+"/"+runtime.GOARCH)
}

Jalankan secara lokal terlebih dahulu:

bash
go run versi-demo.go

Output yang Dihasilkan:

text
sapa v1.2.0
runtime : go1.27.2
platform: linux/amd64

Sekarang bangun binary untuk dua platform lain dari komputer Linux yang sama, lalu periksa format berkasnya dengan perintah file:

bash
GOOS=windows GOARCH=amd64 go build -o sapa.exe versi-demo.go
GOOS=darwin GOARCH=arm64 go build -o sapa-darwin versi-demo.go
file sapa.exe sapa-darwin

Output yang Dihasilkan:

text
sapa.exe: PE32+ executable for MS Windows 10.00 (console), x86-64, 16 sections
sapa-darwin: Mach-O 64-bit arm64 executable, flags:<|DYLDLINK|PIE>

Binary sapa.exe berformat PE untuk Windows dan sapa-darwin berformat Mach-O untuk macOS, keduanya lahir dari mesin Linux tanpa konfigurasi tambahan. Nilai runtime.GOOS di dalam program ikut berubah sesuai target kompilasi, sehingga binary Windows yang dijalankan akan mencetak platform: windows/amd64.

Versi, Checksum, dan Otomatisasi Rilis #

Distribusi yang serius menuntut tiga hal di luar binary itu sendiri. Pertama, nomor versi semantik (v1.2.0: mayor.minor.patch) agar pengguna tahu apa yang berubah; angka versi dapat disuntikkan saat build lewat -ldflags "-X main.version=1.2.0" tanpa mengubah kode. Kedua, checksum sha256sum sapa.exe agar pengguna dapat memverifikasi berkas unduhan tidak berubah di tengah jalan. Ketiga, otomatisasi: alat seperti GoReleaser membangun seluruh matriks GOOS/GOARCH, membuat arsip, menghitung checksum, dan mengunggah rilis GitHub dari satu berkas konfigurasi. Jalur distribusi klasik melalui package manager (apt, brew, choco) tetap relevan untuk menjangkau pengguna yang tidak memasang Go.

Binary yang tersebar di banyak mesin akhirnya mengakhiri perjalanan yang dimulai dari os.Args: menerima argument, membaca flag, menjalankan subcommand, membaca konfigurasi, dan melaporkan hasil lewat output terminal serta exit code. Semua keping itu kini sudah ada di tangan kita.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

versi-demo.go

Unduh berkas
go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("sapa v1.2.0")
	fmt.Println("runtime :", runtime.Version())
	fmt.Println("platform:", runtime.GOOS+"/"+runtime.GOARCH)
}