Ubuntu环境下Golang打包常见问题及解决方案
go mod init <module-name>初始化模块;通过go get -u <package>添加依赖;使用go mod tidy自动同步go.mod和go.sum文件(添加缺失依赖、移除未使用依赖)。dep工具或手动管理vendor目录(仅适用于旧项目)。~/.bashrc(或~/.zshrc)文件,添加以下内容:export GOROOT=/usr/local/go # Go安装路径(默认安装时自动生成)
export GOPATH=$HOME/go # 工作目录(存放依赖和项目)
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin # 添加Go命令到PATH
export GO111MODULE=on # 启用Go Modules(Go 1.16+默认开启)
source ~/.bashrc使配置生效。libresolv.so.2);使用ldd命令查看可执行文件显示“dynamically linked”(动态链接)。CGO_ENABLED=1),或系统缺少C库的静态版本(如.a文件)。CGO_ENABLED=0(强制静态编译)。-ldflags="-extldflags -static"(忽略动态链接器)。CGO_ENABLED=0 go build -ldflags="-s -w -extldflags -static" -o myapp。libopus),需提前安装对应的静态库(如libopus.a),可通过apt-get install libopus-dev获取。GOOS(目标操作系统)和GOARCH(目标架构)环境变量。GOOS=linux GOARCH=amd64 go build -o myapp-linux。GOOS=windows GOARCH=amd64 go build -o myapp.exe。GOOS=linux GOARCH=arm64 go build -o myapp-arm。GOOS(linux/windows/darwin)、GOARCH(amd64/arm/arm64)。chmod命令添加执行权限:chmod +x myapp。./myapp(明确指定当前目录下的可执行文件)。$GOCACHE(默认~/.cache/go-build),无需额外配置。go clean -cache清除所有缓存;go clean -modcache清除模块缓存。-p参数指定并行编译任务数(如go build -p 4,使用4个核心)。debian而非scratch);未静态编译。golang镜像编译,第二阶段使用scratch(最小化镜像)或alpine(轻量级)复制二进制文件。# 构建阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /myapp
# 运行阶段(最小化镜像)
FROM scratch
COPY --from=builder /myapp /
CMD ["/myapp"]
CGO_ENABLED=0,确保生成的二进制文件不依赖动态库。scratch(无额外文件,镜像最小)或alpine(含基础工具,适合需要调试的场景)。