빠른 흐름
go build ./cmd/api
GOOS=linux GOARCH=amd64 go build -o bin/api-linux-amd64 ./cmd/api
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/api ./cmd/apiGo build는 어떤 package를 빌드할지, 어떤 OS/architecture용으로 만들지, cgo가 필요한지를 같이 봅니다.
기본 흐름
현재 환경용 실행 파일은 go build
go build ./cmd/apigo build는 지정한 package를 빌드합니다. main package라면 실행 파일을 만들고, library package라면 빌드 가능 여부를 확인합니다.
출력 파일 이름을 정하려면 -o를 씁니다.
go build -o bin/api ./cmd/api다른 OS/architecture는 GOOS, GOARCH
GOOS=linux GOARCH=arm64 go build -o bin/api-linux-arm64 ./cmd/apiGOOS는 대상 운영체제, GOARCH는 대상 CPU architecture입니다. Linux 서버, macOS 개발 머신, Windows CLI처럼 배포 대상이 다르면 이 두 값을 먼저 확인합니다.
자주 보는 조합은 아래와 같습니다.
| 대상 | 값 |
|---|---|
| Linux x86_64 | GOOS=linux GOARCH=amd64 |
| Linux ARM64 | GOOS=linux GOARCH=arm64 |
| macOS Apple Silicon | GOOS=darwin GOARCH=arm64 |
| Windows x86_64 | GOOS=windows GOARCH=amd64 |
cgo
순수 Go 빌드는 cross compile이 단순하다
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ./cmd/api외부 C 라이브러리를 쓰지 않는 순수 Go 프로그램은 cross compile이 비교적 단순합니다. 작은 서버나 CLI 배포에서 Go의 장점이 크게 드러나는 지점입니다.
cgo가 켜지면 대상 환경 도구체인이 필요할 수 있다
CGO_ENABLED=1이 필요한 코드에서는 대상 OS/architecture에 맞는 C compiler와 library가 필요할 수 있습니다. SQLite driver, 시스템 라이브러리 연동, 일부 native binding을 쓰는 경우에는 cross compile이 단순하지 않을 수 있습니다.
선택 기준
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 현재 환경용 빌드 | go build ./cmd/app |
| 출력 이름 지정 | go build -o bin/app |
| Linux 서버 배포 | GOOS=linux GOARCH=amd64 또는 arm64 |
| 단순한 정적 배포 | CGO_ENABLED=0 검토 |
| C 라이브러리 의존 | cgo와 대상 toolchain 확인 |
주의할 점
cross compile이 된다는 것과 실행 환경에서 문제없이 돈다는 것은 다릅니다. OS별 파일 경로, DNS resolver, 인증서, timezone data, cgo 의존성 같은 실행 환경 차이를 같이 확인해야 합니다. 특히 CGO_ENABLED=0은 배포를 단순하게 만들 수 있지만, cgo가 필요한 package에는 맞지 않습니다.
참고 링크
2 sources