总体判断
对于单个二进制、无 C 依赖的 Go 应用,使用 dh-golang 在 Debian 上打包并不复杂,通常只需少量样板文件即可完成;难点主要来自对 Debian Policy、lintian 规范的理解与少量工程化配置(如 man 手册、systemd 服务、配置文件与权限、升级脚本等)。若采用“预编译二进制 + 最简 debian/rules”的方式,复杂度更低,但可维护性与合规性稍弱。对于希望进入官方仓库或严格遵循动态链接理念的场景,可考虑 gcc-go,但其生态与构建链路更复杂,日常应用并不推荐。
推荐路径与关键步骤
- 安装工具链:sudo apt-get install dh-golang golang-go debhelper
- 生成打包骨架:在项目根目录执行 dh-make-golang,自动生成 debian/ 目录及常用模板文件(适合快速起步与标准化)
- 配置核心文件:
- 构建与检查:debuild -us -uc 或 dpkg-buildpackage -us -uc -b;如需跳过 lintian 可使用后者;对可接受的告警可用 lintian-overrides 进行覆盖
常见难点与对策
- 静态链接与 lintian 告警:Go 常为静态二进制,可能触发如 binary-without-manpage、hardening-no-relro 等告警;可通过添加 man 手册、启用构建时加固(如 -ldflags 与安全选项)、或在 debian/lintian-overrides/ 中对特定告警做“预期行为”标注来化解
- 依赖与打包范围:尽量只打包运行必需的文件与模块,避免把 整个 Go 模块缓存 打进 .deb;debian/control 中的 Build-Depends 需显式声明 dh-golang 与 golang-go,运行时依赖用 Depends: ${shlibs:Depends}, ${misc:Depends} 等占位并在需要时细化
- 工程化内容:若提供 systemd service、默认配置、日志目录、权限与升级脚本(如 postinst/prerm),需补充相应文件(如 debian/*.service、conffiles、dirs、links 等),这会提升可运维性但增加样板量
替代方案与取舍
- 预编译二进制封装:在 debian/rules 中跳过编译,直接安装已构建好的二进制;配合 dpkg-buildpackage -us -uc -b 快速出包,或用 lintian-overrides 管理告警;优点是简单直接,缺点是维护性与上游协同较弱
- gcc-go 动态链接:使用 gcc-go 可获得动态链接产物,更贴近传统 Debian 共享库理念,但项目复杂度、工具链差异与可移植性需额外评估,通常仅在面向官方仓库的严格策略下采用