大道至简。Go 语言千秋万载、一统江湖!
特点:(默认配置下)编译结果是静态链接后的单个可执行文件,没有任何外部依赖,部署和维护非常方便。
“没有外部依赖”说明:
- Linux : 默认 Go 编译出的 Linux elf 直接使用 syscall,连 libc 都不依赖。
- Windows : Go 编译出的 Windows PE 仅依赖 Windows 的系统库dll,因为 Windows 的 syscall ABI 不是稳定的,各个版本直接经常变动。
Install
Manual
wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz
在 .bash_profile , .bashrc 或 /etc/profile 里增加环境变量设置:
export PATH=/usr/local/go/bin:$PATH
#export GOROOT=/usr/local/go # optional
Tips
CLI
go env GOPATH
go env GOROOT
go build
Cross Compile
1.5版以后的 Go 交叉编译非常简单,只需在 build 前设置 GOARCH 和 GOOS 两个环境变量即可
Compile Linux amd64 bin from Windows
set GOARCH=amd64
set GOOS=linux
go build
如果构建目标为 mipsle 的 soft-float 设备,额外加上 GOMIPS=softfloat
GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build
GOARCH 架构:
- mipsle : MIPS, 小尾序。大部分 MIPS SOC 的路由器(例如 MT7621) 都是 mipsle 这种。注意 mips / mipsle 在 Linux 的 file 工具显示结果没有区别,都是 "ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked" 这种。
- mips : MIPS, 大尾序。消费级设备很少用这种SOC。
- amd64
- arm64
构建生产环境(stripped):
go build -ldflags "-s -w"
生成的二进制文件体积能减少 1/3 左右。
Compress binary
可以使用 upx 压缩 Go 生成的二进制可执行文件大小。
upx --best executable_file
upx 工具本身完全跨平台,任何平台的 upx CLI 都支持压缩 Windows PE / Linux ELF 等所有平台的可执行文件。测试能将 Go 1.21 构建的可执行文件压缩到 1/3 左右(而且是在 go build -ldflags "-s -w"
的基础上)。
其它方法:
- tinygo : 测试 Go 1.21 项目构建失败(2023-12)。
参考资料:
vet
go vet .
shadow
需要安装 shadow 这个包
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest
安装后用注册全局 shadow 这个 binary。
然后
shadow .
# or
go vet -vettool="C:\Users\root\go\bin\shadow.exe" .
goreleaser
go install github.com/goreleaser/goreleaser@latest
CI / CD
建议使用 goreleaser
配合 CI / CD 使用时非常简单,只需要 Linux 环境,然后在代码仓库根目录执行:
curl -sfL https://goreleaser.com/static/run |
bash -s -- release --snapshot --clean
构建结果: dist/*.zip
支持 Go 的免费托管 CI / CD 服务
- AppVeyor : 只支持构建 public 仓库。支持 Github。
gvm (go 版本管理)
AppVeyor 的 Linux 镜像预装了 gvm, 可以在 build 脚本里自己安装指定的 Go 版本:
gvm install go1.21.5 -B
gvm use go1.21.5
说明:
- gvm install 必须指定 -B (install from binary) flag,否则默认编译源码安装,坑爹。