多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

如何将 LocalSend 打包成 AppImage,一份产物跑遍所有 Linux 发行版

如何将 LocalSend 打包成 AppImage,一份产物跑遍所有 Linux 发行版 如何将 LocalSend 打包成 AppImage一份产物跑遍所有 Linux 发行版【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend同一份 LocalSend AppImage在 Ubuntu 24.04 的笔记本上双击能开在实验室的 Debian 老机器上能开在刚装好的 Fedora 工作站上也能开不需要 root、不需要 apt、不碰依赖冲突。本文按 Linux 便携文件传输工具 LocalSend 的实际打包流水线走一遍从 AppImage 构建环境准备到多架构产物产出。一分钟看懂 AppImage 的自包含原理AppImage 是 Linux 上一种自包含的便携格式打包时把应用二进制、运行所需的全部共享库、图标和桌面条目塞进一个目录压缩成 squashfs 镜像并嵌入一个 AppRun 入口脚本。运行时它通过 FUSE 把自身挂载到临时目录在挂载点里执行关闭后自动清理全程不往系统目录写任何东西。它的本质是自带运行时——产物不信任宿主机的任何库版本发行版差异因此失效。这正是 LocalSend 选择 AppImage 的原因一次打包产物在哪台机器上跑都不挑环境。下表可以看清它和其他分发格式的分野格式依赖处理安装要求跨发行版AppImage自包含依赖随产物走无需安装双击即跑✅ 任意发行版Snap沙盒隔离系统需装 snapd支持Flatpak运行时容器系统需装 flatpak支持deb/rpm依赖系统库包管理器 root有限 ❌LocalSend AppImage 构建的可执行命令链仓库里两份配方放在support/build/appimage/目录下另有一键脚本support/scripts/compile_linux_appimage.sh可直接参考。下面的命令都从该脚本中提炼按顺序执行即可。AppImage 构建环境与依赖准备这一组命令补齐三类工具Flutter 的 Linux 编译链、LocalSend 托盘功能用的系统头文件、以及 appimage-builder 运行所需的 FUSE 支持。# Flutter Linux 构建工具链编译器、CMake、GTK 头文件等 sudo apt install curl clang cmake libgtk-3-dev ninja-build # LocalSend 编译期依赖的托盘图标库libappindicator sudo apt install libayatana-appindicator3-dev # appimage-builder 运行所需的 FUSE 支持 sudo apt install libfuse2 # 将官方发布的 appimage-builder 二进制放入 PATH版本号以官方 release 为准 chmod x appimage-builder-1.1.0-x86_64.AppImage sudo mv appimage-builder-1.1.0-x86_64.AppImage /usr/local/bin/appimage-builder从 flutter build 到 appimage-builder 的核心命令链注意官方脚本会先把仓库拷到干净的临时目录再构建避免开发工作区的残留文件混进产物这里直接给出核心命令。git clone https://gitcode.com/GitHub_Trending/lo/localsend cd localsend git submodule update --init # 拉取仓库自带的 Flutter SDK alias fluttersubmodules/flutter/bin/flutter flutter clean flutter pub get flutter pub run build_runner build -d # 生成 i18n 等代码 flutter build linux # 产物输出到 build/linux/x64/release/bundle # 组装 AppDirAppImage 的装配目录根下需包含可执行文件与资源 mkdir AppDir cp -r build/linux/x64/release/bundle/* AppDir # 配方放到当前目录appimage-builder 默认读取 AppImageBuilder.yml cp support/build/appimage/AppImageBuilder_x86_64.yml AppImageBuilder.yml appimage-builder chmod x LocalSend-{version}-x86_64.AppImageappimage-builder拿到 AppDir 后会自动下载配方里声明的 apt 依赖并按正确的树形结构放进 AppDir最后用 mksquashfs 压缩成单个 AppImage 文件。Flutter 的 build 输出里已经带了桌面条目、图标和运行时库所以 AppDir 本身不需要手写任何内容。读懂 appimage-builder 配方的三个关键字段配方文件不用整体记忆看这三段就够。app_info段声明应用身份与入口exec指向 AppDir 根下的可执行文件exec_args: $则把命令行参数原样转发给应用这样 AppImage 形态下依然支持透传参数AppDir: app_info: id: org.localsend.localsend_app name: LocalSend icon: localsend version: {version} exec: localsend_app exec_args: $apt段决定哪些运行时库被自动拉进 AppDir。include是白名单LocalSend 只声明了托盘图标库和 SVG 渲染库exclude把图标主题这类无关包剔掉控制产物体积。注意arch必须和最终产物架构一致apt: arch: - amd64 include: - libayatana-appindicator3-1:amd64 - librsvg2-common:amd64 exclude: - adwaita-icon-theme:*runtime.env在应用启动前注入环境变量把标准资源路径拼到系统值前面保证 AppImage 内的 MIME 类型、图标等共享资源优先被命中runtime: env: XDG_DATA_DIRS: /usr/local/share/:/usr/share/:${XDG_DATA_DIRS}多架构 AppImage 怎么构建 arm64 产物arm64 对应配方support/build/appimage/AppImageBuilder_arm_64.yml与 x86_64 版仅差在apt的arch/include架构后缀和文件末尾的AppImage.arch。多架构 AppImage 构建的思路就是在对应架构的机器或 QEMU 环境上换一份配方重跑同一条命令cp support/build/appimage/AppImageBuilder_arm_64.yml AppImageBuilder.yml appimage-builder # 产出 LocalSend-{version}-arm_64.AppImageAppImage 故障排查速查表现象原因解法一执行就报 FUSE 相关错误系统未装 FUSE 模块或 /dev/fuse 不存在安装 libfuse2 并确认内核 FUSE 已加载无头环境调试时用--appimage-extract解压后直接跑 AppRun应用起不来日志提示缺少某个 .so该共享库未在配方apt.include中声明没被打包用ldd逐条比对 AppDir 内缺失的库把对应包名加进 include 列表后重新打包启动后系统托盘图标不出现宿主机 appindicator 后端没有随 AppDir 携带确认 include 里有libayatana-appindicator3-1:amd64LocalSend 配方已包含老版本配方需补上产物比预期大、塞满文档文件未配置文档裁剪规则保留配方中files.exclude段剔除 man 页与 README/changelog 等 doc 文件发布前检查清单产物命名为LocalSend-{version}-{arch}.AppImage且与配方中version字段一致x86_64 与 arm_64 两份配方的version字段同步避免架构间版本错位为每个架构产物生成 GPG 分离签名.sig随产物一起发布产出 SHA256 校验和文件发布后抽查下载文件校验通过发布页确认 x86_64、arm_64 两套产物齐全且均可执行干净虚拟机实跑一遍托盘图标正常、局域网传输流程完整走通整条流水线的逻辑只有一条把运行时依赖全部随产物带走宿主发行版从此无关紧要。一次打包LocalSend 在任意 Linux 机器上开箱即用安装、配置、环境适配全都不存在了。这就是一次打包、到处运行在 Linux 上最实在的落地方式。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表