核心打包工具
Ubuntu 打包生态系统主要围绕以下几个工具:

dpkg: Debian Package 的缩写,它是底层的核心工具,用于安装、构建、管理和移除.deb软件包,你日常使用sudo apt install xxx时,apt底层就是调用dpkg来完成实际的安装工作。apt: 高级包工具,它是dpkg的前端,负责处理软件包的依赖关系、从软件源下载和安装软件包,它让用户使用起来更方便。debuild/dpkg-buildpackage: 这两个是构建.deb包的核心命令,它们读取debian/目录下的规则文件,自动完成编译、打包等复杂过程。equivs: 一个“虚拟包”构建工具,当你想创建一个不包含实际软件,只包含依赖关系的包时(确保某个库已安装),equivs非常有用。checkinstall: 一个简化打包过程的工具,它可以在你make install之后,自动为你创建一个.deb包,但它生成的包质量不如debuild高,不推荐用于正式发布。
标准打包流程 (推荐方法)
这是为开源软件创建高质量 .deb 包的标准方法,尤其适用于那些已经遵循 autotools (./configure, make, make install) 或 CMake 等构建系统的项目。
第 1 步:准备工作
-
安装打包工具 你需要安装构建
.deb包所需的基本工具。sudo apt update sudo apt install build-essential devscripts debhelper dh-make
build-essential: 包含了 C/C++ 编译器 (gcc,g++) 和make等基本构建工具。devscripts: 提供了debuild,uscan等一系列方便的打包脚本。debhelper: 构建系统中处理debian/目录规则的辅助工具集。dh-make: 可以帮助你快速为源码创建一个初始的debian/目录结构。
-
获取源码 将你想要打包的软件源码下载到你的工作目录中,通常源码格式为
.tar.gz或.tar.xz。# 示例:下载一个名为 my-awesome-app-1.0.tar.gz 的源码 wget https://example.com/downloads/my-awesome-app-1.0.tar.gz tar -xvf my-awesome-app-1.0.tar.gz cd my-awesome-app-1.0
第 2 步:创建 debian/ 目录
debian/ 目录是打包的核心,它包含了所有关于包的元数据,如包名、版本、依赖关系、安装规则等。

最简单的方法是使用 dh-make:
# 在源码根目录下执行 # --single: 创建一个二进制包(而不是包含源码的源码包) # -p my-awesome-app: 指定你想要的包名 # -v 1.0-1: 指定初始版本号 dh-make --single -p my-awesome-app -v 1.0-1
执行后,dh-make 会询问你一些信息,如作者、描述、依赖项等,它会自动分析 configure 脚本,并为你生成一个基础的 debian/ 目录,其中包含:
control: 最重要的文件,定义了包的基本信息、依赖关系等。rules: 构建脚本,debuild会根据这个脚本来编译和打包。changelog: 包的更新日志。copyright: 版权信息。- 其他一些文件。
第 3 步:修改 debian/ 目录中的文件
自动生成的 debian/ 目录只是一个模板,你需要根据你的软件进行修改。
-
debian/control: 这是必须修改的文件。
(图片来源网络,侵删)Package:: 确保包名正确。Version:: 确保版本号正确。Architecture:: 构建的目标架构,如amd64,i386,all(表示架构无关)。Depends:: 这是关键,列出你的软件运行时所需要的所有库和包。libc6 (>= 2.17), libgtk-3-0。debuild通常能自动检测到一部分,但你需要手动补充完整。Description:: 软件的简短和详细描述。
-
debian/rules: 通常不需要大改,但如果你有特殊的编译或安装步骤,可以在这里修改,这是一个makefile。 -
debian/changelog: 记录每次包的更新,格式为:my-awesome-app (1.0-1) unstable; urgency=medium * Initial release. (Closes: #XXXXXX) -- Your Name <your.email@example.com> Wed, 25 Oct 2025 10:00:00 +0800
第 4 步:构建 .deb 包
在源码根目录下执行以下命令:
# -us: 不对源码包进行签名 # -uc: 不对.changelog文件进行签名 # -b: 只构建二进制包 debuild -us -uc -b
如果一切顺利,debuild 会自动执行 ./configure, make, make install (到临时目录),然后根据 debian/rules 和 debian/control 的规则,将文件打包成 .deb 文件。
构建成功后,你会在上一级目录()中找到生成的 .deb 文件,../my-awesome-app_1.0-1_amd64.deb。
简单打包方法 (不推荐,但快速)
如果你只是想快速为某个脚本或程序创建一个安装包,而不关心复杂的依赖关系,可以使用 equivs。
示例:创建一个只依赖 python3 的虚拟包
-
安装
equivssudo apt install equivs
-
创建控制文件模板
# 会生成一个名为 my-custom-package 的控制文件模板 equivs-control my-custom-package
-
编辑模板 用你喜欢的编辑器打开
my-custom-package文件,并修改内容。Section: misc Priority: optional Standards-Version: 3.9.2 Package: my-custom-app Version: 1.0 Maintainer: Your Name <your.email@example.com> Depends: python3 Architecture: all Description: A simple custom application This is a description for my custom application. It can be multi-line.
-
构建
.deb包# -f: 如果同名包已存在,则覆盖 equivs-build -f my-custom-package
执行后,你会在当前目录得到 my-custom-app_1.0_all.deb,这个包本身不包含任何程序文件,但它安装时会确保系统已经安装了 python3。
常用 dpkg 命令
在你已经拥有 .deb 文件后,dpkg 是管理它的核心工具。
| 命令 | 描述 |
|---|---|
sudo dpkg -i package.deb |
install:安装一个 .deb 包。 |
sudo dpkg -r package_name |
remove:卸载一个包,但保留配置文件。 |
sudo dpkg -P package_name |
purge:完全卸载一个包,包括其配置文件。 |
dpkg -l |
list:列出所有已安装的包。 |
dpkg -L package_name |
list files:列出某个已安装包包含的所有文件。 |
dpkg -S /path/to/file |
search:查找某个文件属于哪个已安装的包。 |
dpkg -s package_name |
status:显示某个已安装包的详细信息。 |
dpkg -c package.deb |
contents (of package):查看未安装的 .deb 包内包含哪些文件。 |
sudo dpkg --configure -a |
重新配置所有有依赖问题的包,常用于修复 apt 安装中断后的问题。 |
| 场景 | 推荐工具/流程 |
|---|---|
为开源软件创建正式的、高质量的 .deb 包 |
标准流程: dh-make -> 手动修改 debian/ -> debuild |
| 快速创建一个只解决依赖关系的虚拟包 | equivs |
安装一个本地的 .deb 文件 |
sudo dpkg -i package.deb |
| 查看和管理已安装的包 | dpkg 配合 apt (apt list --installed) |
对于任何严肃的打包工作,请务必花时间学习并使用 标准流程,虽然初期看起来复杂,但它能确保生成的包符合 Ubuntu 社区的标准,并且能正确处理依赖关系。
