菜鸟科技网

ubuntu 打包命令

核心打包工具

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

ubuntu 打包命令-图1
(图片来源网络,侵删)
  1. dpkg: Debian Package 的缩写,它是底层的核心工具,用于安装、构建、管理和移除 .deb 软件包,你日常使用 sudo apt install xxx 时,apt 底层就是调用 dpkg 来完成实际的安装工作。
  2. apt: 高级包工具,它是 dpkg 的前端,负责处理软件包的依赖关系、从软件源下载和安装软件包,它让用户使用起来更方便。
  3. debuild / dpkg-buildpackage: 这两个是构建 .deb 包的核心命令,它们读取 debian/ 目录下的规则文件,自动完成编译、打包等复杂过程。
  4. equivs: 一个“虚拟包”构建工具,当你想创建一个不包含实际软件,只包含依赖关系的包时(确保某个库已安装),equivs 非常有用。
  5. checkinstall: 一个简化打包过程的工具,它可以在你 make install 之后,自动为你创建一个 .deb 包,但它生成的包质量不如 debuild 高,不推荐用于正式发布。

标准打包流程 (推荐方法)

这是为开源软件创建高质量 .deb 包的标准方法,尤其适用于那些已经遵循 autotools (./configure, make, make install) 或 CMake 等构建系统的项目。

第 1 步:准备工作

  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/ 目录结构。
  2. 获取源码 将你想要打包的软件源码下载到你的工作目录中,通常源码格式为 .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/ 目录是打包的核心,它包含了所有关于包的元数据,如包名、版本、依赖关系、安装规则等。

ubuntu 打包命令-图2
(图片来源网络,侵删)

最简单的方法是使用 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/ 目录只是一个模板,你需要根据你的软件进行修改。

  1. debian/control: 这是必须修改的文件。

    ubuntu 打包命令-图3
    (图片来源网络,侵删)
    • Package:: 确保包名正确。
    • Version:: 确保版本号正确。
    • Architecture:: 构建的目标架构,如 amd64, i386, all (表示架构无关)。
    • Depends:: 这是关键,列出你的软件运行时所需要的所有库和包。libc6 (>= 2.17), libgtk-3-0debuild 通常能自动检测到一部分,但你需要手动补充完整。
    • Description:: 软件的简短和详细描述。
  2. debian/rules: 通常不需要大改,但如果你有特殊的编译或安装步骤,可以在这里修改,这是一个 makefile

  3. 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/rulesdebian/control 的规则,将文件打包成 .deb 文件。

构建成功后,你会在上一级目录()中找到生成的 .deb 文件,../my-awesome-app_1.0-1_amd64.deb


简单打包方法 (不推荐,但快速)

如果你只是想快速为某个脚本或程序创建一个安装包,而不关心复杂的依赖关系,可以使用 equivs

示例:创建一个只依赖 python3 的虚拟包

  1. 安装 equivs

    sudo apt install equivs
  2. 创建控制文件模板

    # 会生成一个名为 my-custom-package 的控制文件模板
    equivs-control my-custom-package
  3. 编辑模板 用你喜欢的编辑器打开 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.
  4. 构建 .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 社区的标准,并且能正确处理依赖关系。

分享:
扫描分享到社交APP
上一篇
下一篇