在 Ubuntu 上用 Go 打包(编译)慢,通常可以从依赖、编译参数、环境、硬件、CI 配置几个方向优化。下面按「常见原因 → 解决办法」给你一份实用清单。
国内/网络差时,拉依赖最慢。
go env -w GOPROXY=https://proxy.golang.org,direct
# 国内推荐
go env -w GOPROXY=https://goproxy.cn,direct
查看当前:
go env GOPROXY
确保 GOMODCACHE 稳定存在(默认在 ~/go/pkg/mod):
go env GOMODCACHE
不要每次构建都清 cache:
# 错误示例(CI 里常见)
rm -rf ~/go/pkg/mod
CGO 会调用 gcc,极慢且依赖系统库。
export CGO_ENABLED=0
go build -o app .
或:
CGO_ENABLED=0 go build -o app .
除非你明确用到 sqlite / openssl 等 C 库,否则都建议关掉
go build -ldflags="-s -w" -o app .
可显著减小体积 & 加快链接。
确认:
go env GOMAXPROCS
手动指定:
GOMAXPROCS=4 go build
Go 编译是大量小文件读写,HDD 直接劝退。
检查磁盘:
lsblk
❌ 不推荐:
✅ 推荐:
编译大项目时内存不足会狂用 swap:
free -h
建议:
用 multi-stage + 缓存层:
FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o app .
FROM alpine
COPY --from=build /src/app /app
关键点:
go mod download✅ 缓存:
~/go/pkg/mod./buildGitHub Actions 示例:
- uses: actions/cache@v4
with:
path: ~/go/pkg/mod
key: go-mod-${{ hashFiles('**/go.sum') }}
go mod tidy
使用:
go list -m all
删除“重量级”库(如某些大框架)
Go 是包级编译,一个巨大 package 改一行全重编。
✅ 拆小、解耦
export GOPROXY=https://goproxy.cn,direct
export CGO_ENABLED=0
export GOMAXPROCS=4
go mod download
go build -ldflags="-s -w" -o app .
你可以告诉我:
go build 还是 Docker?我可以直接给你针对性配置或 Dockerfile。