发行版打包实战: Arch AUR PKGBUILD 编写与 deb/rpm 制作

将软件源码或编译产物分发给终端用户时,直接让用户使用 make install 容易破坏系统软件目录,且无法实现依赖跟踪与卸载。使用发行版原生的包格式(如 Arch Linux 的 .pkg.tar.zst、Debian/Ubuntu 的 .deb 以及 Fedora/RHEL 的 .rpm)是现代 Linux 运维与开发的唯一正道。

本文将深入介绍三类发行版主流打包规范的结构与编写流程。


1. Arch Linux AUR PKGBUILD 打包实战

Arch Linux 的包管理简单高效,所有包均通过包含元数据与 Shell 函数的 PKGBUILD 脚本构建。

1.1 PKGBUILD 脚本核心结构

一个标准的 PKGBUILD 模板如下:

# Maintainer: Your Name <your.email@example.com>
pkgname=myawesomeapp
pkgver=1.0.0
pkgrel=1
pkgdesc="An awesome application for Linux users"
arch=('x86_64' 'aarch64')
url="https://github.com/example/myawesomeapp"
license=('GPL3')
depends=('glibc' 'openssl')
makedepends=('cmake' 'gcc')
source=("${url}/archive/v${pkgver}.tar.gz")
sha256sums=('a1b2c3d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef0')
 
prepare() {
    cd "${pkgname}-${pkgver}"
    # 放置补丁应用逻辑或源码修订
}
 
build() {
    cd "${pkgname}-${pkgver}"
    cmake -B build -S . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
    cmake --build build
}
 
package() {
    cd "${pkgname}-${pkgver}"
    # DESTDIR 模拟根目录,将文件安装至逻辑打包区
    DESTDIR="${pkgdir}" cmake --install build
}

1.2 makepkg 打包流程与规范

# 1. 自动计算源码校验码并填入 PKGBUILD
updpkgsums
 
# 2. 编译并安装构建出的软件包(-s 安装依赖,-i 编译后通过 pacman 安装,-c 清理构建缓存)
makepkg -sic
 
# 3. 对生成的包进行静态规范检查
namcap PKGBUILD
namcap myawesomeapp-1.0.0-1-x86_64.pkg.tar.zst
ℹ️ DESTDIR 规则

package() 函数中,切记不可直接写入真正的系统的 /usr/bin,而必须安装至指定的 ${pkgdir} 目录下。makepkg 稍后会自动读取 ${pkgdir} 内的目录树归档压缩。


2. Debian / Ubuntu .deb 打包流程

Debian 系软件包打包分为简易手造包 (dpkg-deb) 与源码自动化构建包 (debuild)。

2.1 极速手造 .deb 包 (dpkg-deb)

适合用于分发预编译二进制文件或简单 Shell 脚本工具。

创建标准的物理目录树:

mytool_1.0.0-1_amd64/
├── DEBIAN/
│   ├── control
│   ├── postinst
│   └── prerm
└── usr/
    ├── bin/
    │   └── mytool
    └── share/
        └── doc/
            └── mytool/
                └── README.md

DEBIAN/control 控制文件

Package: mytool
Version: 1.0.0-1
Section: utils
Priority: optional
Architecture: amd64
Maintainer: Developer <dev@example.com>
Depends: libc6 (>= 2.31), curl
Description: My Tool is a fast CLI tool for developer automation.
 It simplifies system administration operations.

维护钩子脚本 (如 DEBIAN/postinst)

#!/bin/bash
set -e
# 在安装文件写入完毕后自动刷新图标缓存或服务
systemctl daemon-reload || true

确保钩子赋予可执行权限:chmod +x DEBIAN/postinst DEBIAN/prerm

执行构建与校验

dpkg-deb --build mytool_1.0.0-1_amd64
# 生成 mytool_1.0.0-1_amd64.deb
dpkg -c mytool_1.0.0-1_amd64.deb  # 查看包含的文件列表

2.2 规范的 Debian 源码打包 (debian/ 规则)

生产环境中更推荐在源码树中包含 debian/ 目录:

  • debian/control: 定义源码包与二进制包依赖关系。
  • debian/rules: 实际的 Makefile(通常基于 dh 自动工具简化):
    #!/usr/bin/make -f
    %:
    	dh $@
  • 执行 debuild -us -uc 进行完整打包。

3. Fedora / RHEL .rpm 打包规范与 RPMBUILD

Fedora 和 Red Hat Enterprise Linux 使用 RPM 包格式,构建配置文件为 .spec

3.1 搭建 RPM 构建环境

sudo dnf install -y rpm-build rpmdevtools
# 初始化用户目录下的 rpmbuild 工作区 (~/rpmbuild/BUILD, SPECS, SOURCES, RPMS, SRPMS)
rpmdev-setuptree

3.2 SPEC 文件编写模版

~/rpmbuild/SPECS/mytool.spec 中写入:

Name:           mytool
Version:        1.0.0
Release:        1%{?dist}
Summary:        A modern system utility for Linux
 
License:        MIT
URL:            https://github.com/example/mytool
Source0:        %{url}/archive/v%{version}.tar.gz
 
BuildRequires:  gcc, cmake, make
Requires:       openssl
 
%description
A modern system utility that provides real-time system metrics.
 
%prep
# 解压源码包并进入目录
%autosetup
 
%build
%cmake
%cmake_build
 
%install
%cmake_install
 
%files
%license LICENSE
%doc README.md
%{_bindir}/mytool
 
%changelog
* Tue Jul 21 2026 Developer <dev@example.com> - 1.0.0-1
- Initial release of version 1.0.0

3.3 构建与输出

# 将源码包放入 SOURCES 目录
cp v1.0.0.tar.gz ~/rpmbuild/SOURCES/
 
# 开始执行编译与打包 (ba 代表 Build All: 生成二进制 RPM 与源码 SRPMS)
rpmbuild -ba ~/rpmbuild/SPECS/mytool.spec
 
# 检查打包结果
ls -l ~/rpmbuild/RPMS/x86_64/mytool-1.0.0-1*.rpm

4. 三大平台打包语法对照表

概念/要素Arch Linux (PKGBUILD)Debian/Ubuntu (.deb)Fedora/RHEL (.rpm)
元数据文件PKGBUILDDEBIAN/control*.spec
构建工具makepkgdpkg-deb / debuildrpmbuild
虚拟安装根目录${pkgdir}debian/tmp 或手动相对路径%{buildroot}
运行时依赖字段depends=(...)Depends: ...Requires: ...
构建时依赖字段makedepends=(...)Build-Depends: ...BuildRequires: ...
安装钩子.install 文件 (post_install)DEBIAN/postinst%post, %preun 区块

5. 总结

学会构建发行版原生包是开发者走向工业级应用发布的重要里程碑。无论是上传作品至 Arch AUR,还是搭建私有 Debian/RPM APT/YUM 软件仓库,遵从各发行版官方的 Packaging Guidelines 均能最大化确保系统的稳定与安全。

Navigation