如何简化Ubuntu Golang打包步骤
导读:简化 Ubuntu 上的 Golang 打包 一 本地一键打包脚本 在项目根目录创建可复用的脚本,统一设置CGO_ENABLED=0(静态链接、提升可移植性)、输出目录与名称,一条命令完成构建与归档。 示例脚本 build.sh(可执行:...
简化 Ubuntu 上的 Golang 打包
一 本地一键打包脚本
- 在项目根目录创建可复用的脚本,统一设置CGO_ENABLED=0(静态链接、提升可移植性)、输出目录与名称,一条命令完成构建与归档。
- 示例脚本 build.sh(可执行:chmod +x build.sh):
#!/usr/bin/env bash
set -e
APP="myapp"
OUT_DIR="bin"
LDFLAGS="-s -w" # 去除符号与调试信息,减小体积
# 目标三元组:可改为 linux/arm64、windows/amd64 等
GOOS=${
GOOS:-linux}
GOARCH=${
GOARCH:-amd64}
mkdir -p "$OUT_DIR"
CGO_ENABLED=0 GOOS=$GOOS GOARCH=$GOARCH \
go build -ldflags "$LDFLAGS" -o "$OUT_DIR/$APP-$GOOS-$GOARCH" .
# 打包
tar czf "$OUT_DIR/$APP-$GOOS-$GOARCH.tar.gz" -C "$OUT_DIR" "$APP-$GOOS-$GOARCH"
echo "Saved: $OUT_DIR/$APP-$GOOS-$GOARCH.tar.gz"
- 使用方式:
- 本地 Linux amd64:直接运行:./build.sh
- 交叉编译 Windows:GOOS=windows GOARCH=amd64 ./build.sh
- 交叉编译 ARM64:GOOS=linux GOARCH=arm64 ./build.sh
- 如需进一步压缩体积,可安装 upx 并在打包前执行:upx --best “$OUT_DIR/$APP-$GOOS-$GOARCH”。
二 使用 Make 自动化
- 用 Makefile 将常用目标(build、cross、clean、dist)集中管理,减少记忆成本与输入错误。
- 示例 Makefile:
APP := myapp
OUT_DIR := bin
LDFLAGS := -s -w
GOOS ?= linux
GOARCH ?= amd64
BINARY := $(OUT_DIR)/$(APP)-$(GOOS)-$(GOARCH)
.PHONY: all build cross clean dist
all: build
build:
@mkdir -p $(OUT_DIR)
CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) \
go build -ldflags '$(LDFLAGS)' -o $(BINARY) .
cross:
@$(MAKE) build GOOS=linux GOARCH=amd64
@$(MAKE) build GOOS=linux GOARCH=arm64
@$(MAKE) build GOOS=windows GOARCH=amd64
dist: cross
cd $(OUT_DIR) &
&
sha256sum *.tar.gz >
checksums.txt
clean:
rm -rf $(OUT_DIR)
- 常用命令:
- make
- make cross
- make dist
- make clean。
三 Docker 多阶段最小化镜像
- 用官方 Go 镜像构建,第二阶段用 scratch 仅拷贝二进制,镜像最小、部署最稳。
- 示例 Dockerfile:
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -trimpath -ldflags '-s -w' -o /app/myapp .
# 运行阶段(极小体积)
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
- 构建与导出:
- docker build -t myapp:latest .
- docker save myapp:latest | gzip > myapp.tar.gz
- 如需包含时区/证书等最小依赖,可改用 alpine 作为运行阶段并拷贝 ca-certificates、tzdata。
四 效率与体积优化要点
- 静态链接更便携:设置 CGO_ENABLED=0,避免目标机缺少依赖库导致无法运行。
- 减小体积:使用 -ldflags “-s -w” 去除符号与调试信息;再用 upx --best 进一步压缩(注意可能略微增加启动时间)。
- 加快构建:启用 Go 构建缓存(默认已启用),并行编译(如 -p 参数),并在 Docker 中先单独缓存 go mod download 以复用依赖层。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何简化Ubuntu Golang打包步骤
本文地址: https://pptw.com/jishu/749114.html
