niri发行版打包指南:Debian/RPM规范与依赖处理
1. 项目概述与打包准备
niri是一款基于Wayland协议的滚动平铺式合成器(scrollable-tiling Wayland compositor),其核心特性是将窗口排列在无限水平滚动的列中,新窗口创建不会导致已有窗口重排。打包前需确认以下基础信息:
- 源码仓库:
https://gitcode.com/GitHub_Trending/ni/niri - 构建系统:Cargo(Rust包管理器)
- 开发依赖:Rust 1.70+、Clang、Wayland开发库等
- 核心特性:默认包含systemd集成、DBus支持、XDP屏幕录制等模块
⚠️ 警告:严禁使用
--all-features构建!部分开发特性(如性能分析内存缓冲区)会导致内存泄漏。
2. 构建配置与编译参数
2.1 特性选择矩阵
| 特性组合 | 适用场景 | 编译命令 |
|---|---|---|
| 默认特性 | 大多数发行版 | cargo build --release |
| systemd替代 | 使用dinit的系统 | cargo build --release --no-default-features --features dinit,dbus |
| 最小化构建 | 嵌入式系统 | cargo build --release --no-default-features --features basic-x11 |
2.2 版本信息注入
打包时需手动注入版本与提交哈希,确保崩溃日志可追溯:
# RPM构建(spec文件中)
export NIRI_BUILD_COMMIT="$(git rev-parse --short HEAD)"
export NIRI_BUILD_VERSION_STRING="25.01-1.fc39"
# Debian构建(rules文件中)
dh_auto_build -- --release NIRI_BUILD_COMMIT=$(git rev-parse --short HEAD)
3. RPM打包规范(基于niri.spec.rpkg)
3.1 构建依赖声明
BuildRequires: cargo-rpm-macros >= 26
BuildRequires: pkgconfig(udev)
BuildRequires: pkgconfig(gbm)
BuildRequires: pkgconfig(xkbcommon)
BuildRequires: wayland-devel
BuildRequires: pkgconfig(libinput)
BuildRequires: pkgconfig(dbus-1)
BuildRequires: pkgconfig(systemd)
BuildRequires: pkgconfig(libseat)
BuildRequires: pipewire-devel
BuildRequires: clang # 用于pipewire-rs绑定生成
3.2 安装路径配置
| 文件类型 | 源路径 | 目标路径 | 权限 |
|---|---|---|---|
| 主二进制 | target/release/niri | /usr/bin/ | 0755 |
| 会话启动器 | resources/niri-session | /usr/bin/ | 0755 |
| 桌面会话项 | resources/niri.desktop | /usr/share/wayland-sessions/ | 0644 |
| systemd服务 | resources/niri.service | /usr/lib/systemd/user/ | 0644 |
| 门户配置 | resources/niri-portals.conf | /usr/share/xdg-desktop-portal/ | 0644 |
3.3 运行时依赖
Requires: mesa-dri-drivers >= 22.3
Requires: mesa-libEGL >= 22.3
Recommends: xdg-desktop-portal-gtk # 桌面门户实现
Recommends: alacritty # 默认终端模拟器
Recommends: swaylock # 屏幕锁定工具
4. Debian打包规范(手动适配版)
4.1 控制文件模板(debian/control)
Source: niri
Section: x11
Priority: optional
Maintainer: Your Name <your@email.com>
Build-Depends: debhelper-compat (= 13),
cargo,
rustc (>= 1.70),
libudev-dev,
libgbm-dev,
libxkbcommon-dev,
wayland-dev,
libinput-dev,
libdbus-1-dev,
libsystemd-dev,
libseat-dev,
pipewire-dev,
clang,
libpango1.0-dev,
libcairo-gobject-dev
Standards-Version: 4.6.2
Homepage: https://github.com/YaLTeR/niri
Package: niri
Architecture: any
Depends: ${misc:Depends}, ${shlibs:Depends},
mesa-dri-drivers,
mesa-utils
Recommends: xdg-desktop-portal-gtk,
alacritty,
fuzzel,
swaylock
Description: Scrollable-tiling Wayland compositor
Windows are arranged in columns on an infinite strip going to the right.
Opening a new window never causes existing windows to resize.
4.2 规则文件(debian/rules)
#!/usr/bin/make -f
export CARGO_HOME=$(CURDIR)/.cargo
export NIRI_BUILD_COMMIT=$(shell git rev-parse --short HEAD)
%:
dh $@ --buildsystem cargo
override_dh_auto_build:
dh_auto_build -- --release
override_dh_auto_test:
# 排除开发专用的视觉测试
dh_auto_test -- --workspace --exclude niri-visual-tests
override_dh_install:
dh_install target/release/niri usr/bin/
dh_install resources/niri-session usr/bin/
dh_install resources/niri.desktop usr/share/wayland-sessions/
dh_install resources/niri-portals.conf usr/share/xdg-desktop-portal/
dh_install resources/niri.service usr/lib/systemd/user/
5. 依赖管理高级策略
5.1 关键依赖锁定
niri对以下组件有严格版本要求,需在打包时特别注意:
| 依赖项 | 版本约束 | 获取方式 |
|---|---|---|
| smithay | 特定Git提交 | 从Cargo.lock提取commit hash |
| wayland-protocols | ≥1.31 | 系统包管理器 |
| pipewire | ≥0.3.65 | 系统包管理器 |
⚠️ 警告:smithay作为Wayland核心依赖,使用上游Git快照而非稳定版,必须使用Cargo.lock中记录的精确提交哈希。
5.2 依赖冲突解决
| 冲突场景 | 解决方案 | 示例 |
|---|---|---|
| 系统库版本过低 | 启用vendored特性 | cargo build --features vendored-libgit2 |
| 符号冲突 | 静态链接问题库 | RUSTFLAGS="-C link-arg=-Wl,--allow-multiple-definition" |
| 测试依赖冲突 | 隔离测试环境 | cargo test --no-default-features |
6. 测试与质量保证
6.1 构建后验证清单
# 验证二进制完整性
file target/release/niri | grep "ELF 64-bit LSB executable"
# 验证版本信息
target/release/niri --version | grep "niri [0-9]\+\.[0-9]\+ ([0-9a-f]\+)"
# 验证桌面会话
grep -q "Exec=niri-session" resources/niri.desktop
6.2 测试执行策略
# 基础测试(排除视觉测试)
cargo test --workspace --exclude niri-visual-tests
# 处理高核心数系统文件描述符限制
export RAYON_NUM_THREADS=2
cargo test --test-threads=2
# 跳过需要surfaceless EGL的测试
cargo test -- --skip=::egl
7. 打包后验证与分发
7.1 功能验证矩阵
| 验证项 | 测试命令 | 预期结果 |
|---|---|---|
| 会话启动 | dbus-run-session niri | 无错误日志,Wayland socket创建成功 |
| 窗口管理 | niri-ctl create-window | 新窗口在滚动列中正确排列 |
| 屏幕录制 | xdg-desktop-portal-gnome | 支持GNOME屏幕录制API |
| 崩溃处理 | niri panic | 生成包含文件行号的完整回溯 |
7.2 分发最佳实践
-
调试信息处理:
- RPM:通过
%debug_package分离调试符号 - Debian:使用
dh_strip --dbgsym-migration='niri-dbgsym (<= 25.01-1)'
- RPM:通过
-
文档安装:
- 安装路径:
/usr/share/doc/niri/ - 包含文件:README.md、默认配置示例、LICENSE
- 安装路径:
-
shell补全:
# 生成补全文件 niri completions bash > niri.bash-completion install -Dm644 niri.bash-completion /usr/share/bash-completion/completions/niri
8. 常见问题解决方案
| 问题 | 根本原因 | 解决方案 |
|---|---|---|
| 启动时segfault | 缺少libseat后端 | 安装libseat-systemd或libseat-elogind |
| 窗口无装饰 | pango依赖缺失 | 确保cairo-gobject-devel已安装 |
| 屏幕闪烁 | Mesa驱动问题 | 添加Recommends: mesa-vulkan-drivers |
| 无法录屏 | 门户配置错误 | 验证niri-portals.conf路径正确性 |
9. 附录:打包资源清单
9.1 必备文件
| 文件 | 用途 | 打包必要性 |
|---|---|---|
| niri.desktop | 桌面会话入口 | 必需 |
| niri-session | 会话启动脚本 | 必需 |
| niri-portals.conf | 门户配置 | 必需 |
| systemd服务文件 | 会话管理 | 推荐 |
| 默认配置示例 | 用户参考 | 推荐 |
9.2 打包工具链推荐
| 发行版 | 工具链 | 配置示例 |
|---|---|---|
| Fedora | rpmbuild + cargo-rpm-macros | 使用niri.spec.rpkg作为基础 |
| Debian | debhelper + cargo-deb | 需手动创建debian/目录结构 |
| Arch | makepkg + cargo | 使用PKGBUILD自动生成 |
本文档遵循CC-BY-SA 4.0协议,可自由分发和修改。建议配合niri官方打包文档使用以获取最新更新。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



