发行版打包实战: 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在 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-setuptree3.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.03.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*.rpm4. 三大平台打包语法对照表
| 概念/要素 | Arch Linux (PKGBUILD) | Debian/Ubuntu (.deb) | Fedora/RHEL (.rpm) |
|---|---|---|---|
| 元数据文件 | PKGBUILD | DEBIAN/control | *.spec |
| 构建工具 | makepkg | dpkg-deb / debuild | rpmbuild |
| 虚拟安装根目录 | ${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 均能最大化确保系统的稳定与安全。