ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RustDesk 如何用 build.py 构建 Linux deb 安装包?

RustDesk 如何用 build.py 构建 Linux deb 安装包? RustDesk 如何用 build.py 构建 Linux deb 安装包【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdeskRustDesk 仓库根目录的 build.py 是官方构建脚本它能在 Linux 主机上从源码直接产出可安装的.deb安装包。这篇文章走的是 flutter 版 UI 的 deb 打包路径在一台没有安装 pacman/yum/zypper 的 Debian/Ubuntu 系 Linux 机器上运行./build.py --flutter脚本完成 cargo 编译、flutter 编译、deb 组装后会在仓库根目录生成rustdesk-version.deb版本号取自 Cargo.toml 的version字段无需手工填写。先确认主机走的是 deb 分支build.py 的main()按主机上存在的包管理器二进制文件分派打包路径判断顺序是存在/usr/bin/pacman→ 走 Arch/Manjaro 路径makepkg -f存在/usr/bin/yum→ 走res/rpm.spec打 RPM存在/usr/bin/zypper→ 走res/rpm-suse.spec打 RPM以上都没有 → 走 deb 分支。也就是说构建 deb 的机器不能装有这三类包管理器普通 Debian/Ubuntu 环境默认满足。deb 分支内部分两种带--flutter参数时进入build_flutter_deb()这是使用仓库内 res/DEBIAN 资源的主打包路径不带该参数时走 sciter inline UI 的旧路径依赖仓库根目录的DEBIAN目录和libsciter-gtk.so。本文只讲 flutter 路径。准备条件flutter deb 路径依次调用以下工具主机上需要具备python3运行 build.py 本身cargo执行cargo build --locked --features flutter --lib --releaseflutter进入flutter/目录后执行flutter build linux --releasedpkg-deb最后一步用dpkg-deb -b组装安装包。另外有一个前置文件要求cargo 构建完成后脚本会对flutter/lib/generated_bridge.dart做一次sed修改ffi_bindgen_function_refactor()中的 workaround所以该 FFI 桥接文件必须已经由 flutter_rust_bridge 工具链生成好。build.py 源码中内置的 Docker 构建脚本展示的完整前置顺序是安装 Flutter → 全局激活ffigen→ 安装flutter_rust_bridge_codegen→ 运行flutter pub get→ 运行 codegen 生成generated_bridge.dart→ 再执行./build.py --flutter。可选的环境变量和参数DEB_ARCH写入 control 文件的Architecture字段未设置时默认amd64设为armhf时 control 的Depends会额外追加libatomic1--hwcodec启用hwcodeccargo feature在 Linux 上需要libva-dev脚本 help 文本原样说明。执行构建在仓库根目录运行./build.py --flutter脚本随后按以下顺序工作其中features由命令行参数决定只传--flutter时就是flutter一个 featurecargo build --locked --features flutter --lib --release # sed 修复 flutter/lib/generated_bridge.dartffi_bindgen_function_refactor cd flutter flutter build linux --release # 组装 tmpdeb 目录、生成 control、拷贝 res/DEBIAN/*、计算 md5sums dpkg-deb -b tmpdeb rustdesk.deb任何一条子命令非零退出脚本会向 stderr 打印Error occurred when executing:cmd. Exiting.并立即退出这是构建失败时唯一的统一报错形式。deb 里装了什么build_flutter_deb()先创建tmpdeb暂存目录再逐项拷贝最终打进安装包的内容如下包内路径来源/usr/share/rustdesk/flutter/build/linux/x64/release/bundle/*整个目录/usr/share/rustdesk/files/systemd/rustdesk.serviceres/rustdesk.service/usr/share/icons/hicolor/256x256/apps/rustdesk.pngres/128x1282x.png/usr/share/icons/hicolor/scalable/apps/rustdesk.svgres/scalable.svg/usr/share/applications/rustdesk.desktopres/rustdesk.desktop/usr/share/applications/rustdesk-link.desktopres/rustdesk-link.desktop/usr/share/rustdesk/files/polkit脚本写入#!/bin/sh内容并chmod ax的占位脚本/DEBIAN/controlgenerate_control_file()按下方模板生成/DEBIAN/preinst、/DEBIAN/postinst、/DEBIAN/postrm、/DEBIAN/prermres/DEBIAN/ 目录整体拷贝/DEBIAN/md5sums脚本对tmpdeb内所有非 DEBIAN 文件逐一计算 MD5control 文件不是静态资源而是每次构建时由generate_control_file()先删除旧的res/DEBIAN/control再重新生成的模板%s为脚本替换位Package: rustdesk Section: net Priority: optional Version: %s Architecture: %s Maintainer: rustdesk inforustdesk.com Homepage: https://rustdesk.com Depends: libgtk-3-0t64 | libgtk-3-0, libxcb-randr0, libxdo3 | libxdo4, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2t64 | libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, gstreamer1.0-pipewire%s Recommends: libayatana-appindicator3-1 Description: A remote control software.其中第一个%s是 Cargo.toml 版本号第二个是DEB_ARCH默认amd64第三个在armhf时补libatomic1。构建结束后脚本会删除tmpdeb/和刚生成的res/DEBIAN/control仓库保持干净。安装后的行为包内行为由 res/DEBIAN/postinst 定义在configure阶段创建符号链接/usr/bin/rustdesk → /usr/share/rustdesk/rustdesk如果/proc/1/exe显示 init 是systemd删除旧的服务文件把/usr/share/rustdesk/files/systemd/rustdesk.service拷入/usr/lib/systemd/system/将服务文件中的pkill改写为绝对路径/usr/bin/pkill注释说明这是为了修复 Ubuntu 18.04 上Executable path is not absolute的报错然后依次执行systemctl daemon-reload、systemctl enable rustdesk、systemctl start rustdesk。因此在一台 systemd 主机上装完这个 deb预期结果是 rustdesk 服务被启用并随开机启动且/usr/bin/rustdesk命令可用非 systemd 主机只会得到符号链接服务不会自动启动。结果验证与失败判定成功仓库根目录出现rustdesk-version.deb脚本最后一步把rustdesk.deb重命名为带版本号的文件名版本号与 Cargo.toml 一致失败终端出现Error occurred when executing: ...并退出按该行打印的命令定位是哪一步失败——cargo 编译、flutter 编译或dpkg-deb -b任一环出错都会走同一个报错路径。可选分支以下参数只影响同一 deb 任务的构建方式按需选用--hwcodec编译时启用硬件编解码 featureLinux 上需先装libva-dev--unix-file-copy-paste额外启用unix-file-copy-pastefeature--skip-cargo跳过 cargo 编译直接打包已有的target/与 flutter 产物help 说明为“flutter version Linux supported currently”--package bundle目录不编译直接用一个现成的 flutter bundle 目录走build_deb_from_folder()打 deb。注意脚本会做一致性检查若该目录里带libdrmtap.so.0.*而没有传--drm会直接报错拒绝打包--drm仅限 Linux 且仅限 deb 分支pacman/yum/zypper 主机上会直接抛异常拒绝。它会用 meson 从固定 pin 的 libdrmtap 仓库编译libdrmtap.so打进包、把 control 改写为rustdesk-unattended-wayland追加Conflicts: rustdesk、Provides: rustdesk以及libdrm2 ( 2.4.101)、libegl1、libgles2等依赖最终产物改名为rustdesk-unattended-wayland-version.deb。编译 libdrmtap 需要 EGL 开发包报错提示给出 Debian/Ubuntu 为libegl-dev libgles2-mesa-dev缺 EGL 头文件时会构建出 CPU-only 桩库并被脚本的_assert_so_has_egl()拦截--print-features只打印当前参数组合选出的 cargo feature 列表并退出不执行构建。需要注意的边界--drm与其他 Linux 打包分支pacman/yum/zypper互斥且该变体包与标准rustdesk包互相冲突二者只能装其一这是脚本明确用异常信息强制的行为不是安装建议。【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表