あなたの作った便利なGo製ツール、macOSの自分用だけでなくWindowsを使っている同僚や、Linuxサーバー上でも手軽に動かしたいと思ったことはありませんか?
Go言語の最大の魅力の一つである「クロスコンパイル」が、この課題を解決します。この記事ではGoのクロスコンパイルの基本からMakefile
と、GoReleaser
を使った実践的なビルド・リリース自動化のテクニックを解説します。
クロスコンパイルとは、開発している環境とは異なるOS・アーキテクチャ向けのバイナリを生成する技術です。Goは標準でこの機能をサポートしており、環境変数を設定するだけで簡単に実現できます。
Goのクロスコンパイルは、GOOS
(ターゲットOS)と GOARCH
(ターゲットCPUアーキテクチャ)という2つの環境変数を設定するだけで実現できます。
bash1# Windows向け64bitバイナリをビルド 2GOOS=windows GOARCH=amd64 go build -o myapp.exe 3 4# macOS (Apple Silicon)向けバイナリをビルド 5GOOS=darwin GOARCH=arm64 go build -o myapp_mac_arm 6 7# Linux (ARM64)向けバイナリをビルド 8GOOS=linux GOARCH=arm64 go build -o myapp_linux_arm 9 10# Linux (x86_64)向けバイナリをビルド 11GOOS=linux GOARCH=amd64 go build -o myapp_linux_amd64
注意: cgoを利用する場合はDockerやzigを使ったcross-compilationが必要です。
bash1# CGO_ENABLED=1 GOOS=linux go build ... # Docker や zig cc 前提
go tool dist list
コマンドで、サポートされているGOOS
/GOARCH
の組み合わせ一覧を確認できます。
bash1# デスクトップ・サーバー 2GOOS=linux GOARCH=amd64 # Linux x86_64 3GOOS=linux GOARCH=arm64 # Linux ARM64 4GOOS=darwin GOARCH=amd64 # macOS Intel 5GOOS=darwin GOARCH=arm64 # macOS Apple Silicon 6GOOS=windows GOARCH=amd64 # Windows x86_64 7GOOS=windows GOARCH=arm64 # Windows ARM64 8 9# モバイル・組み込み 10GOOS=android GOARCH=arm64 # Android ARM64 11GOOS=ios GOARCH=arm64 # iOS ARM64 12GOOS=linux GOARCH=riscv64 # RISC-V 64bit 13GOOS=freebsd GOARCH=amd64 # FreeBSD 14GOOS=openbsd GOARCH=amd64 # OpenBSD
cgoを使用するプロジェクトでは、追加の設定が必要です:
Docker を使用した方法
bash1# Linux ARM64向けビルド(Docker使用) 2docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp \ 3 golang:1.22-alpine \ 4 sh -c "apk add --no-cache gcc musl-dev && \ 5 CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \ 6 CC=aarch64-linux-musl-gcc go build -o myapp-linux-arm64"
zig cc を使用した方法
bash1# zig をクロスコンパイラとして使用 2CGO_ENABLED=1 GOOS=linux GOARCH=arm64 \ 3CC="zig cc -target aarch64-linux-musl" \ 4CXX="zig c++ -target aarch64-linux-musl" \ 5go build -o myapp-linux-arm64
GoReleaser での cgo 対応設定例
yaml1builds: 2 - id: myapp-cgo 3 env: 4 - CGO_ENABLED=1 5 goos: 6 - linux 7 - darwin 8 goarch: 9 - amd64 10 - arm64 11 # Docker環境でのクロスコンパイル 12 hooks: 13 pre: 14 - docker run --rm -v {{ .Env.PWD }}:/workspace -w /workspace 15 golang:1.22-alpine sh -c "apk add --no-cache gcc musl-dev"
多くのプロジェクトで採用されている、伝統的で柔軟な自動化手法です。
make
は多くのUnix系環境に標準で入っており、ビルドコマンドを定型化するのに便利なツールです。
makefile1# Makefile 2BINARY_NAME=myapp 3VERSION=v1.0.0 4BUILD_DIR=dist 5BUILD_TIME=$(shell date -u +%Y-%m-%dT%H:%M:%SZ) 6GIT_COMMIT=$(shell git rev-parse --short HEAD) 7 8# ターゲットOSとARCHの組み合わせを定義 9TARGETS=linux/amd64 darwin/arm64 windows/amd64 10 11# 再現性ビルドのためのフラグ 12GOFLAGS=-trimpath 13LDFLAGS=-s -w -X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME) -X main.gitCommit=$(GIT_COMMIT) 14 15.PHONY: build clean release 16 17build: 18 @echo "Building for multiple platforms..." 19 @mkdir -p $(BUILD_DIR) 20 @for target in $(TARGETS); do \ 21 OS=$$(echo $$target | cut -d'/' -f1); \ 22 ARCH=$$(echo $$target | cut -d'/' -f2); \ 23 EXT=""; \ 24 if [ "$$OS" = "windows" ]; then EXT=".exe"; fi; \ 25 echo "Building $$OS/$$ARCH..."; \ 26 GOOS=$$OS GOARCH=$$ARCH go build \ 27 $(GOFLAGS) \ 28 -ldflags="$(LDFLAGS)" \ 29 -o $(BUILD_DIR)/$(BINARY_NAME)-$$OS-$$ARCH-$(VERSION)$$EXT .; \ 30 done 31 32clean: 33 @echo "Cleaning build directory..." 34 @rm -rf $(BUILD_DIR) 35 36release: 37 @echo "Creating release with GoReleaser..." 38 goreleaser release --clean --rm-dist
再現性ビルドオプションの説明:
-trimpath
: ビルド時のファイルパス情報を除去し、どの環境でビルドしても同じバイナリを生成BUILD_TIME
とGIT_COMMIT
: ビルド情報をバイナリに埋め込み、デバッグ時に有用make build
コマンドを実行するだけで、dist
ディレクトリ内に各プラットフォーム向けのバイナリが生成されます。
ビルドだけでなく、リリース作業全体を自動化するモダンなアプローチです。
GoReleaser
は、クロスコンパイルから圧縮、チェックサム生成、GitHub/GitLabへのリリース作成まで、リリースに関わる一連の作業を完全に自動化するツールです。
.goreleaser.yml
)の例yaml1# .goreleaser.yml 2project_name: myapp 3builds: 4 - id: myapp 5 main: ./cmd/myapp 6 binary: myapp 7 goos: 8 - linux 9 - windows 10 - darwin 11 goarch: 12 - amd64 13 - arm64 14 ldflags: 15 - -s -w -X main.version={{.Version}} 16archives: 17 - id: tar-archives 18 builds: [myapp] 19 format: tar.gz 20 name_template: >- 21 {{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }} 22 files: 23 - README.md 24 - LICENSE 25 - id: zip-archives 26 builds: [myapp] 27 format: zip # Windows 用 28 name_template: >- 29 {{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }} 30 files: 31 - README.md 32 - LICENSE 33 filter: 34 goos: [windows] 35checksum: 36 name_template: 'checksums.txt' 37release: 38 github: 39 owner: your-username 40 name: your-repo
bash1# 設定ファイルの初期化(初回プロジェクトでのみ実行) 2goreleaser init 3 4# 実際のリリース実行 5git tag v1.0.0 6git push origin v1.0.0 7goreleaser release --clean --rm-dist
このコマンド一発でGitHubのリリース・ページに、各プラットフォーム向けの圧縮ファイルとチェックサムファイルが自動でアップロードされます。
タグプッシュだけでリリースまで完全自動化する最終形態です。
yaml1# .github/workflows/release.yml 2name: Release 3on: 4 push: 5 tags: ['v*.*.*'] 6 7jobs: 8 goreleaser: 9 runs-on: ubuntu-latest 10 steps: 11 - uses: actions/checkout@v4 12 with: 13 fetch-depth: 0 14 15 - uses: actions/setup-go@v4 16 with: 17 go-version: '1.22' 18 19 - name: Set up QEMU (ARM build support) 20 uses: docker/setup-qemu-action@v3 21 22 - name: Run GoReleaser 23 uses: goreleaser/goreleaser-action@v5 24 with: 25 version: latest 26 args: release --clean 27 env: 28 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
完全自動化の流れ:
git tag v1.0.0 && git push origin v1.0.0
これによりタグプッシュから数分後には、GitHub Releaseページに各OS用バイナリが自動で公開されます。
多くの場合、開発中はmake
で手軽にビルドし、リリース時はGoReleaser
で完全自動化するという使い分けが効果的です。
実務導入時の抜け漏れ防止のため、以下の項目を確認してください:
GOOS
/GOARCH
の組み合わせを確認済み-trimpath
フラグでビルドパス情報を除去TARGETS
変数に必要なプラットフォームを定義.exe
拡張子処理を実装.goreleaser.yml
の初期化完了GITHUB_TOKEN
権限設定確認済みhtml1<!-- OpenGraph / Twitter Card 例 --> 2<meta property="og:title" content="Goクロスコンパイル完全ガイド|MakefileとGoReleaserでビルドとリリースを自動化する"> 3<meta property="og:description" content="Go言語のクロスコンパイル機能を活用し、複数OS向けのビルドとリリースを自動化する方法を解説。MakefileとGoReleaserを使った実践的な手法で開発効率を劇的に向上"> 4<meta property="og:image" content="https://example.com/go-cross-compile.png"> 5<meta property="og:url" content="https://example.com/go-cross-compile-guide"> 6<meta name="twitter:card" content="summary_large_image"> 7<meta name="twitter:title" content="Goクロスコンパイル完全ガイド|自動化でビルド効率を劇的向上"> 8<meta name="twitter:description" content="MakefileとGoReleaserを使ったGo言語クロスコンパイルの実践的自動化テクニック">
GoのクロスコンパイルはMakefile
で手軽に、GoReleaser
で完全に自動化できます。ビルドやリリースのような手作業は、自動化することでミスを減らしより多くの時間を創造的なコーディングに使うことができます。これはプロフェッショナルなエンジニアの重要な習慣です。
私たちGoForceは、Goのコーディングスキルだけでなく、このような開発プロセス全体を効率化する、高い生産性意識を持つフリーランスエンジニアを高く評価しています。あなたのその「自動化する力」と「プロの開発作法」を、次の挑戦的なプロジェクトで活かしませんか。
最適なGo案件を今すぐチェック!