Debian 下简化 Golang 打包的实操方案
一、推荐路径 dh-golang + dh-make-golang
- 安装工具链:sudo apt-get install dh-golang dh-make-golang golang-go debhelper。
- 一键生成打包骨架:在项目根目录执行 dh-make-golang,按向导填写包名、维护者、许可证等;生成标准 debian/ 目录与模板文件(如 control、rules、changelog、copyright、install 等)。
- 按需微调:
- 在 debian/control 的 Build-Depends 中保留 dh-golang 与 golang-go(或 golang-any),其余运行时依赖按实际填写。
- 在 debian/rules 中使用 dh-golang 的标准目标,通常无需手写复杂逻辑;示例:
- %:
- dh $@ --buildsystem=golang --with=golang
- 构建与检查:debuild -us -uc 或 dpkg-buildpackage -us -uc -b;完成后用 lintian 做质量检查并修复可采纳的告警。
二、极简二进制封装(预编译 + dpkg-buildpackage)
- 适用场景:上游已提供可复现的构建产物,或你已在外部完成交叉编译,只想快速封装为 .deb。
- 核心思路:让 debian/rules 跳过编译,仅执行安装;用 dpkg-buildpackage 直接产出二进制包。
- 关键步骤:
- 准备上游发布的 tar.gz(或你本地的发布包),解压到源码树根。
- 生成最小化 debian/ 骨架(可用 dh-make-golang 的“binary”模板或手工创建)。
- 在 debian/rules 中写入:
- 在 debian/install 指定安装路径,例如:
- your-go-app /usr/bin/
- config.toml /etc/your-go-app/
- static/ /usr/share/your-go-app/static/
- 构建:dpkg-buildpackage -us -uc -b;如需跳过 lintian 可仅用 dpkg-buildpackage,或添加 lintian-overrides 文件对特定告警做忽略。
三、常见坑与处理建议
- 静态链接与 lintian:Go 程序常静态链接,可能触发如 binary-without-manpage、hardening-no-relro 等告警。可在 debian/lintian-overrides/ 中按需忽略,或完善包内容(如补充手册页、启用加固选项)再消除告警。
- 依赖与构建系统:使用 dh-golang 时,确保 Build-Depends 正确声明 dh-golang 与 golang-go/golang-any;Go 模块依赖尽量由 dh-golang 解析,系统级依赖另行声明。
- 许可证与版权:debian/copyright 需覆盖项目自身与所有依赖模块的许可证;可使用工具或脚本聚合 LICENSE 文件,确保合规与可追溯。
- 交付物最小化:只打包必要的二进制与资源,避免把 $GOPATH/pkg/mod 或完整源码打进包体,减少体积与泄露风险。
四、最快落地命令清单
- 方案A(推荐):dh-golang 全流程
- sudo apt-get install dh-golang dh-make-golang golang-go debhelper
- cd your-go-app && dh-make-golang
- 编辑 debian/control(Build-Depends: dh-golang, golang-go/golang-any;Depends 按需)
- 编辑 debian/install(例如:your-go-app /usr/bin/)
- debuild -us -uc
- 方案B(极简封装):预编译 + dpkg-buildpackage
- 准备上游 tar.gz 并置于项目根
- dh-make-golang 生成骨架(选 binary)
- 在 debian/rules 写入:%: dh $@ --no-build
- 在 debian/install 指定安装路径
- dpkg-buildpackage -us -uc -b