在 Go(Golang)项目打包到 Ubuntu 时,依赖处理主要取决于你是:
下面分情况说明 ✅
如果你的项目 没有使用 CGO,Go 默认是 静态编译 的:
CGO_ENABLED=0 go build -o myapp
.deb 依赖./myapp
✅ 基本不需要处理依赖
如果你用了:
import "C"sqlitenet(部分 DNS)cryptoCGO_ENABLED=1 go build -o myapp
| 功能 | Ubuntu 依赖 |
|---|---|
| C 标准库 | libc6 |
| SSL | libssl-dev |
| SQLite | libsqlite3-dev |
| GCC | build-essential |
ldd myapp
输出示例:
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
libpthread.so.0 => ...
.deb 包(推荐方式)sudo apt install build-essential devscripts debhelper
myapp/
├── debian/
│ ├── control
│ ├── rules
│ └── compat
├── main.go
debian/control(关键)Package: myapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Depends: libc6, libssl3
Maintainer: you@example.com
Description: My Go App
✅ Depends 就是 Ubuntu 依赖声明
dpkg-buildpackage -us -uc
生成:
myapp_1.0.0_amd64.deb
sudo dpkg -i myapp_1.0.0_amd64.deb
sudo apt -f install # 自动处理缺失依赖
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
go build -ldflags '-extldflags "-static"' -o myapp
检查:
file myapp
输出应包含:
statically linked
✅ 可跨 Ubuntu 版本直接运行
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app
FROM ubuntu:22.04
COPY --from=builder /app/app /usr/local/bin/app
CMD ["app"]
✅ 宿主机无需任何 Go 依赖
| 场景 | 推荐方案 |
|---|---|
| 纯 Go 程序 | 静态编译 |
| 有 CGO | 在 debian/control 声明依赖 |
| 服务器部署 | 静态二进制 / Docker |
| 提供软件给用户 | .deb + Depends |
如果你愿意,可以告诉我:
.deb?我可以直接帮你 写完整的 deb 打包示例或 Dockerfile。