golang編譯方式一般分為兩種,一種是源碼編譯,另外一個是交叉編譯
1.源碼編譯
這種方式需要在機器上安裝相應的go sdk,可以參考環境部署相關的文章,這里不再敘述;我們只需要把項目代碼copy到相應的機器上,然后再項目目錄中,執行命令:go build ./main.go -o outdir,編譯速度非常快,接着在outdir文件中即可看到編譯后的二進制文件或exe文件
2.交叉編譯
在編譯到linux等其他目標平台前,需要在機器上安裝MingGW c++編譯環境。更多信息請參考官網文檔:https://github.com/golang/go/wiki#release-specific-information
GOOS:目標平台的操作系統(darwin、freebsd、linux、windows)
GOARCH:目標平台的體系架構(386、amd64、arm)
交叉編譯不支持 CGO 所以要禁用它,如果要使用CGO,需要源碼編譯構建。
The valid combinations of GOOS and GOARCH are:
GOOS |
GOARCH |
aix |
ppc64 |
android |
386 |
android |
amd64 |
android |
arm |
android |
arm64 |
darwin |
386 |
darwin |
amd64 |
darwin |
arm |
darwin |
arm64 |
dragonfly |
amd64 |
freebsd |
386 |
freebsd |
amd64 |
freebsd |
arm |
illumos |
amd64 |
js |
wasm |
linux |
386 |
linux |
amd64 |
linux |
arm |
linux |
arm64 |
linux |
ppc64 |
linux |
ppc64le |
linux |
mips |
linux |
mipsle |
linux |
mips64 |
linux |
mips64le |
linux |
s390x |
netbsd |
386 |
netbsd |
amd64 |
netbsd |
arm |
openbsd |
386 |
openbsd |
amd64 |
openbsd |
arm |
openbsd |
arm64 |
plan9 |
386 |
plan9 |
amd64 |
plan9 |
arm |
solaris |
amd64 |
windows |
386 |
windows |
amd64 |
2.1 Windows主機編譯Linux,MAC客戶端
Windows主機編譯Windows客戶端
SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o abc-demo-windows.exe main.go
Windows主機編譯LINUX客戶端
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o abc-demo-linux main.go
Windows主機編譯MAC客戶端
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build -o abc-demo-mac main.go
2.2 Linux主機編譯Widows,MAC客戶端
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o abc-demo-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o adc-demo-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o abc-demo-windows.exe main.go
2.3 MAC主機編譯Widows,linux客戶端
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o abc-demo-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o abc-demo-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o abc-demo-windows.exe main.go
這里以windows下編譯linux amd64示例,直接編寫一個bat腳本,然后雙擊執行
編譯比源碼編譯少慢了點,結果如下:
可以看到成功的編譯了一個二進制文件hai,該文件可以直接在目標平台上以 ./hai &的方式運行起來。
3.多平台一鍵打包
下面就來介紹一下打包神器 GoReleaser
goreleaser是一個自動化打包工具,解放雙手,省去腳本編寫,同時還支持對接CI/CD。
下面我們通過一個簡單的例子來說明怎么使用 GoReleaser
3.1. 工具安裝
下載安裝 goreleaser (go get -u -v github.com/goreleaser/goreleaser)
安裝后執行 goreleaser -v 命令判斷是否安裝成功
3.2. 創建demo工程
這次以hai項目為例,也可以自己新建一個hello world項目嘗試
3.3. 初始化配置
然后在該項目根目錄執行 goreleaser init ,將會生成一個.goreleaser.yml配置文件
打開文件
3.4. 修改配置
默認配置文件需要稍作修改以滿足我們的需求
我們的demo項目沒有使用go generate,需要把 - go generate ./... 注釋掉
添加我們需要的目標操作系統類型及架構
經過修改后的配置文件如下
3.5. 打包
然后執行打包命令來驗證是否打包成功
goreleaser --snapshot --skip-publish --rm-dist
可以看到編譯的情況及速度
打包成功后將會在項目根目錄/dist下生成各種不同平台的可執行文件
3.6.配置文件說明
id:打包后目錄前綴
goos:目標系統
goarch:目標CPU架構
snapshot.name_template:生成壓縮包名稱前綴
詳細配置請參考官網
build配置: 編譯配置
archives配置:打包配置
goos和goarch是乘積關系,至於為什么沒有生成windows_arm64這樣的可執行程序 是因為windows不能再arm上跑。
golang官網也列出了goos和goarch的兼容表。