niri发行版打包指南:Debian/RPM规范与依赖处理

niri发行版打包指南:Debian/RPM规范与依赖处理

【免费下载链接】niri A scrollable-tiling Wayland compositor. 【免费下载链接】niri 项目地址: https://gitcode.com/GitHub_Trending/ni/niri

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 分发最佳实践

  1. 调试信息处理

    • RPM:通过%debug_package分离调试符号
    • Debian:使用dh_strip --dbgsym-migration='niri-dbgsym (<= 25.01-1)'
  2. 文档安装

    • 安装路径:/usr/share/doc/niri/
    • 包含文件:README.md、默认配置示例、LICENSE
  3. 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 打包工具链推荐

发行版工具链配置示例
Fedorarpmbuild + cargo-rpm-macros使用niri.spec.rpkg作为基础
Debiandebhelper + cargo-deb需手动创建debian/目录结构
Archmakepkg + cargo使用PKGBUILD自动生成

本文档遵循CC-BY-SA 4.0协议,可自由分发和修改。建议配合niri官方打包文档使用以获取最新更新。

【免费下载链接】niri A scrollable-tiling Wayland compositor. 【免费下载链接】niri 项目地址: https://gitcode.com/GitHub_Trending/ni/niri

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值