Debian 官方规范:https://www.debian.org/doc/debian-policy/
Debian 官方教程(内含中文):https://www.debian.org/doc/manuals/packaging-tutorial/
1. 概述
👉 Debian 打包的相关文件及作用:
bash
debian/control → 类似 Python 的 pyproject.toml。描述这个包是什么的元信息(如包名,版本,依赖,架构,描述,通过 man 5 deb-postinst 查用法,)
debian/rules → 构建阶段起作用:规定了如何构建软件包。控制如何build, 安装路径等
debian/postinst(可选)
debian/postrm (可选) → postxxx 等维护脚本 安装时起作用 → 控制安装行为
.........
debian/changelog → 版本记录,dpkg 用它决定版本号
debian/compat → ⚠️(旧方式,半必须,比如就写个13)指定 debhelper 版本,新项目通常用:debhelper-compat 写在 control 里
usr/... → 真正安装的文件
!TIP
debian/rules本质是个特殊的Makefile (用户执行dpkg-buildpackage -us -uc -A时起作用)作用在构建阶段(build time):一般做的工作包括:编译 Python / C++、生成.whl、拷贝到 `/usr/ 等。
- 它使用了 Debian 的
debhelper工具链语法混合了 Makefile 和 Shell 命令。- man 手册查细节:
man 5 deb-src-rules当用户执行如
dpkg-buildpackage -us -uc -A命令时,执行的步骤链:
- 读取 debian/changelog(确定版本)
- 检查 debian/control(依赖、包信息)
- 执行 debian/rules clean
- 执行 debian/rules build
- 执行 debian/rules install
- 执行 debian/rules binary
- 调用 dpkg-deb 生成 .deb
- 生成 .changes / .buildinfo
!TIP
Debian 一共有 4个维护脚本(本质是shell脚本) (在用户执行
dpkg -i xxx.deb时起作用):
文件 执行时机 man手册查细节 preinst 安装前 man 5 deb-pretinstpostinst 安装后(启动服务,安装依赖,创建配置,修改权限) man 5 deb-postinstprerm 删除前 man 5 deb-prermpostrm 删除后(删除残留,清理配置,停止服务) man 5 deb-postrm
2. 打包工具了解
我了解到有多个工具,但我只用过dpkg-deb与dpkg,他们什么关系?
【高级构建命令】 dpkg-buildpackage ← 顶层调度器,读取 debian/ 目录,可通过 debian/rules 来调用 debhelper
【自动化构建工具集】 debhelper ← 工具集,核心是命令是dh(debhelper), 本质是一组"自动化构建步骤工具",如dh_install,dh_python3,dh_clean,dh_strip
【用户简单解包】 dpkg-deb ← 负责打包 / 解包 (手动搬砖盖房)
【用户,只是用】 dpkg ← 负责安装 / 卸载 / 管理
下面是我常用的命令:
shell
dpkg-deb -R my.deb tmp # 解包,将my.deb解包到 tmp 目录
dpkg-deb -b tmp xxx.deb # 打包,将tmp 目录打包到 my.deb 文件
比如:
mkdir pkg
写 DEBIAN/control
写 postinst
cp 文件
dpkg-deb -b pkg
shell
dpkg -i xxx.deb
dpkg -P xxx 删除包,将安装的deb文件连根拔起,彻底删除
dpkg -r xxx 删除包,但保留配置文件,如/etc目录下的内容
dpkg -L xxx 包安装好后,查看安装位置
dpkg -l
3. 你自己做 deb 的最小步骤
1️⃣ 创建目录结构
Shell
mkdir -p mypkg/DEBIAN
mkdir -p mypkg/usr/local/bin
2️⃣ 写 control
Shell
vim mypkg/DEBIAN/control
3️⃣ 写脚本(可选)
shell
vim mypkg/DEBIAN/postinst
chmod +x mypkg/DEBIAN/postinst
4️⃣ 放程序文件
Shell
cp myapp mypkg/usr/local/bin/
5️⃣ 打包
Shell
dpkg-deb -b mypkg mypkg.deb