Goのクロスコンパイルばり便利
Goの便利な機能の一つにクロスコンパイルがあります。
同OSでの実行ファイルはもちろんのこと、例えばMac上でWindows用のexeファイルを作ったりできます。
GithubActionsと連携することで、さらに楽にクロスプラットフォーム向けに実行ファイルをリリースできるので
やり方を紹介します。
前提
- Go 1.13以降
- Go Modules使用
- 今回の開発環境はVSCode Remote Containerで用意(ここはまぁ何でも良いと思います)
手順
- プロジェクト直下に以下の.goreleaser.ymlを配置。
.goreleaser.yml
project_name: sample # 任意の名前を設定する
env:
- GO111MODULE=on
before:
hooks:
- go mod tidy
builds:
- main: . # mainのディレクトリを指定する
binary: sample # 任意の名前を設定する
goos:
- windows
- darwin
- linux
goarch:
- amd64
env:
- CGO_ENABLED=0
archives:
- name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
replacements:
darwin: darwin
linux: linux
windows: windows
386: i386
amd64: x86_64
format_overrides:
- goos: windows
format: zip
files: # zipやtarに実行ファイル以外に含ませたいファイルがあれば設定する
- config.ini
- README.md
release:
prerelease: auto
- プロジェクト直下に.github/release.ymlを配置する。
.github/release.yml
name: release # 任意の名前を設定する
on:
push:
tags: # 任意のtag この例ではv0.0.0のような形でtagを切るとReleaseされる
- "v[0-9]+\\.[0-9]+\\.[0-9]+"
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Setup Go
uses: actions/setup-go@v1
with:
go-version: 1.13
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v1
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- (上の2ファイルをPushした後)gitコマンドを実行
git tag v0.1.0
git push origin v0.1.0
サンプル
こちら
(release.ymlのパスが.github/workflows/release.ymlになっているけどあまり気にせず)
参考