PostgreSQL RPM 仓库正在迎来一个重要变化:原本尽量避免引入 Rust 依赖的打包策略开始调整,pgrx 和 postgresql_anonymizer 已经进入 RPM 仓库,同时配套的 Rust 扩展打包指南也开始落地。
这意味着 PostgreSQL 扩展开发者可以更容易地把基于 Rust 的扩展交付给使用 RPM 系列发行版的用户。不过,当前支持的发行版范围仍然有限,升级和部署时需要确认平台版本是否在支持列表中。
为什么 Rust 扩展需要专门的打包规则
Rust 扩展与传统的 C 扩展在构建方式上不同。它们通常需要 Cargo、Rust 编译器以及一组 crates 依赖,构建过程还可能受到 Rust toolchain 版本、架构和发行版生命周期的影响。
对 PostgreSQL RPM 仓库来说,直接把 Rust 项目当作普通扩展处理,会带来几个实际问题:
- 构建环境需要提供稳定且可复现的 Rust 依赖。
- RPM 构建过程必须把编译产物安装到 PostgreSQL 期望的位置。
- 不同 RHEL 兼容发行版的编译器和系统库版本可能不同。
- 扩展包需要与对应的 PostgreSQL 主版本和系统架构匹配。
因此,这次变化不只是新增两个包,也包括围绕 pgrx 的打包规范。规范化之后,后续 Rust 扩展更容易遵循同一套构建和发布流程。
先确认平台,再安装扩展
摘要提到,当前支持的发行版范围存在限制,后续还计划增加 RHEL 10.3 和 9.9 支持。生产环境不应只根据包名判断是否可以安装,而要同时核对 PostgreSQL 版本、操作系统版本和架构。
可以先用下面的命令检查当前环境:
set -eu
printf 'OS: '
. /etc/os-release
printf '%s %s\n' "$ID" "$VERSION_ID"
printf 'Architecture: '
arch
printf 'PostgreSQL client: '
psql --version
printf 'Enabled PostgreSQL repositories:\n'
dnf repolist enabled | grep -i postgres || true
如果仓库已经配置完成,可以按实际包名安装对应扩展。下面的命令以 PostgreSQL 16 为例,包名和仓库名称应根据目标发行版及仓库实际内容调整:
sudo dnf install \
pgrx_16 \
postgresql_anonymizer_16
安装 RPM 并不等于扩展已经在数据库中启用。安装完成后,还需要在目标数据库中执行扩展初始化:
CREATE EXTENSION IF NOT EXISTS anon;
pgrx 更多时候是 Rust 扩展开发和构建生态的一部分,具体是否需要在运行时安装名为 pgrx 的数据库扩展,应以目标项目的安装说明和 RPM 内容为准。上面的包名是实践示例,不代表所有受支持平台都会使用完全相同的命名方式。
对扩展维护者的影响
对于维护 PostgreSQL Rust 扩展的团队,RPM 仓库开始接纳 Rust 包意味着发布流程需要更早考虑发行版兼容性。建议在项目中明确记录以下信息:
- 支持的 PostgreSQL 主版本。
- 支持的 RHEL 或兼容发行版版本。
- Rust toolchain 和 Cargo 依赖要求。
- 扩展 SQL 文件、共享库和控制文件的安装位置。
- 是否需要额外的系统库或运行时依赖。
一个最小的构建检查脚本可以这样写,用来在 CI 中提前验证 Rust 和 PostgreSQL 环境:
#!/usr/bin/env bash
set -euo pipefail
: "${PG_CONFIG:=pg_config}"
command -v cargo >/dev/null || {
echo "cargo is required" >&2
exit 1
}
PG_VERSION="$($PG_CONFIG --version)"
RUST_VERSION="$(rustc --version)"
printf 'Building against %s\n' "$PG_VERSION"
printf 'Using %s\n' "$RUST_VERSION"
cargo build --release
这类检查不能替代完整的 RPM 构建,但能尽早暴露工具链缺失、pg_config 不在 PATH 中等问题。真正进入仓库构建时,还需要遵循 PostgreSQL RPM 仓库的 Rust 扩展打包指南,并在目标发行版上验证生成的 RPM。
采用时的检查清单
部署前可以逐项确认:
- 当前发行版和版本是否属于已支持范围。
- 仓库中是否提供目标 PostgreSQL 主版本的扩展包。
- 包名、依赖和架构是否与环境匹配。
- 是否在测试数据库中执行过
CREATE EXTENSION。 - 升级 PostgreSQL 或操作系统时,是否重新验证 Rust 扩展。
- 是否为扩展升级准备了回滚和备份方案。
Rust 扩展进入 PostgreSQL RPM 仓库,降低了用户从源码构建扩展的门槛,也让扩展维护者拥有更正式的分发路径。现阶段最重要的工作不是盲目升级,而是根据支持矩阵验证平台,并把扩展安装和数据库启用拆成两个独立步骤管理。