在 Ubuntu 下把 Go 程序打包成 .deb 常见有几种方式,从“手动 control 文件”到“用工具自动打包”。下面按最实用、最常用的方式给你讲。
sudo apt update
sudo apt install -y dpkg-dev debhelper build-essential
假设你的程序叫 myapp:
GOOS=linux GOARCH=amd64 go build -o myapp
mkdir -p myapp_1.0.0_amd64/DEBIAN
mkdir -p myapp_1.0.0_amd64/usr/bin
cp myapp myapp_1.0.0_amd64/usr/bin/
control 文件nano myapp_1.0.0_amd64/DEBIAN/control
内容示例:
Package: myapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Maintainer: you <you@example.com>
Description: A simple Go application
This is a demo Go app packaged as deb.
chmod 0755 myapp_1.0.0_amd64/DEBIAN
chmod 0755 myapp_1.0.0_amd64/usr/bin/myapp
dpkg-deb --build myapp_1.0.0_amd64
生成:
myapp_1.0.0_amd64.deb
sudo dpkg -i myapp_1.0.0_amd64.deb
myapp
dh-make + debhelper(规范 Debian 包)适合 长期维护、发布到仓库
mkdir myapp && cd myapp
dh_make --native -s -p myapp_1.0.0
debian/controlArchitecture: amd64
mkdir -p debian/myapp/usr/bin
cp myapp debian/myapp/usr/bin/
dpkg-buildpackage -us -uc
生成:
../myapp_1.0.0_amd64.deb
fpm(非常推荐)sudo apt install ruby ruby-dev
sudo gem install fpm
打包:
fpm -s dir -t deb -n myapp -v 1.0.0 \
--architecture amd64 \
./myapp=/usr/bin/myapp
nfpm(Go 生态专用)go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest
nfpm.yaml 示例:
name: myapp
arch: amd64
version: 1.0.0
maintainer: you <you@example.com>
description: Go app
contents:
- src: ./myapp
dst: /usr/bin/myapp
打包:
nfpm package -f nfpm.yaml -t myapp.deb
✅ Go 程序 必须静态或自带依赖
✅ deb 包里不要用 go run
✅ 架构要一致(amd64 / arm64)
✅ systemd 服务要放 /lib/systemd/system/
| 场景 | 推荐 |
|---|---|
| 快速内部使用 | 手动 / fpm |
| 正式发布 | dh-make |
| Go 项目 CI | nfpm |
如果你是:
可以告诉我,我可以直接给你 完整 deb 模板。