在 Debian 上把一个 Go 程序打包成 deb 包,常见且“正规”的做法有几种,取决于你是自己用、内部发布还是上 Debian 官方仓库。下面从最简单到最规范逐步说明。
dh-make-golang(官方风格)这是 Debian 官方推荐方式,适合长期维护。
sudo apt update
sudo apt install -y dh-make-golang build-essential devscripts fakeroot
假设你的项目在 GitHub:
dh-make-golang github.com/yourname/yourrepo
它会自动:
debian/ 目录control、rules、changelogcd yourrepo
dpkg-buildpackage -us -uc -b
生成的 deb 在上一层目录:
../yourrepo_0.1.0-1_amd64.deb
✅ 优点:最规范、可进 Debian
❌ 缺点:流程稍复杂
fpm 打包(推荐个人/内部)如果你只是想 快速打一个能装的 deb,这是最简单方案。
sudo apt install -y ruby ruby-dev rubygems build-essential
sudo gem install fpm
CGO_ENABLED=0 go build -o myapp
fpm -s dir -t deb \
-n myapp \
-v 1.0.0 \
-a amd64 \
--prefix /usr/bin \
myapp
生成:
myapp_1.0.0_amd64.deb
✅ 优点:极快、可控
❌ 缺点:不符合 Debian 官方规范
debian/ 目录(进阶)适合 CI / 自动化。
目录结构:
myapp/
├── myapp
└── debian/
├── control
├── rules
├── changelog
└── install
Package: myapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Maintainer: you <you@example.com>
Description: My Go app
A simple Go program.
myapp usr/bin/
dpkg-deb --build myapp
Debian 上 Go 程序建议:
CGO_ENABLED=0 go build -ldflags="-s -w"
避免依赖 glibc 版本问题。
如果你要开机启动:
debian/myapp.service
[Unit]
Description=My Go App
[Service]
ExecStart=/usr/bin/myapp
Restart=always
[Install]
WantedBy=multi-user.target
并在 debian/rules 或 postinst 中启用。
| 场景 | 推荐方式 |
|---|---|
| 自己/内部用 | fpm |
| 长期维护 | dh-make-golang |
| CI 自动打包 | 手动 debian/ |
| 想进 Debian | dh-make-golang |
如果你愿意,可以告诉我:
我可以直接帮你写一套 完整 debian/ 模板或 CI 脚本。