LocalSend 的 AppImage 打包拆解:两份 YAML 让一次构建跑遍 Ubuntu、Fedora、Arch

发布时间:2026/10/7 2:30:09

LocalSend 的 AppImage 打包拆解:两份 YAML 让一次构建跑遍 Ubuntu、Fedora、Arch LocalSend 的 AppImage 打包拆解两份 YAML 让一次构建跑遍 Ubuntu、Fedora、Arch【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend为什么在 Fedora 上双击就能跑把 release 页里的LocalSend-x86_64.AppImage拷到一台 Fedora 机器上chmod x双击系统托盘图标直接出来不用挨个装 GTK、不用装 libayatana。这就是 LocalSend 的 AppImage 形态的卖点运行时依赖被塞进一个文件里同一份构建在 Ubuntu、Fedora、Arch 上直接跑。但问题不止于此——系统托盘依赖的库很多发行版默认根本没装必须带进包里包体积又得压住。LocalSend 的答案简单得超出预期两份 YAML 加一个 shell 脚本。桌面版 AppImage 与手机在同一局域网互相发现设备名和指纹直接对上构建脚本里哪几行是关键入口是 support/scripts/compile_linux_appimage.sh核心就这几行git submodule update --init # Flutter SDK 以子模块形式锁进仓库 alias fluttersubmodules/flutter/bin/flutter # flutter 命令指向仓库内的 SDK flutter clean flutter pub get flutter pub run build_runner build -d # 代码生成i18n 字符串、riverpod 绑定等 flutter build linux cp -r build/linux/x64/release/bundle/* AppDir # 构建产物整个拷进 AppDir设计意图是可复现本地脚本用 git 子模块锁 Flutter 版本CI 则用FLUTTER_VERSION: 3.41.9钉死见 build_linux_appimage_x64.yml两边不会用到不同编译器。产物不是单个二进制而是整个bundle/目录——AppImage 打包就是这个目录再塞几个 apt 库一起压进 squashfs。appimage-builder 配方里到底带了哪些库support/build/appimage/AppImageBuilder_x86_64.yml 全文不到 70 行核心是apt段整个仓库只带两个库apt: arch: [amd64] allow_unauthenticated: true # 跳过 gpg 校验CI 里省事 sources: - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted # ... 还有 jammy-updates、jammy-security 等共 9 条源 include: - libayatana-appindicator3-1:amd64 # 系统托盘tray_manager 插件走 AppIndicator 协议 - librsvg2-common:amd64 # GTK 渲染 SVG 图标 exclude: - adwaita-icon-theme:* # 把整包主题图标排除掉libayatana-appindicator3-1是托盘图标的关键。app/pubspec.yaml里声明了tray_manager: 0.5.3这个插件在 Linux 上靠 AppIndicator 协议画托盘图标没有这个库应用能启动但托盘直接消失。librsvg2-common负责 SVG 图标渲染。两个库都从 Ubuntu 22.04jammy的源里拉main/universe/multiverse 的源全部显式列出了。这里就是 AppImage 跨发行版的根因运行时只依赖宿主机内核和 FUSE宿主机装没装 GTK、装的什么版本都不重要——需要的库全在镜像里。依赖基线就是jammy 上能跑的版本而 jammy 是 LTS版本稳定不会漂移。exclude: adwaita-icon-theme:*也别忽略apt 装某些库会连带拉进整套 Adwaita 主题图标好几个 MB显式排掉。包里排除了哪些文件同一个 YAML 的files.exclude是第二个减重点排掉 apt 包自带的 man 页和文档files: exclude: - usr/share/man - usr/share/doc/*/README.* - usr/share/doc/*/changelog.* - usr/share/doc/*/NEWS.* - usr/share/doc/*/TODO.*这些都是没人会读的文件排掉不影响任何功能。配合上一节的exclude最终包体积大致等于Flutter 构建 bundle 两个库没有多余的东西。托盘图标和图标是怎么进 AppDir 的app_info里写着icon: localsend引用一个叫 localsend 的图标但 Flutter 构建产物里没有它。CI 里有一步 Copy logo to AppDir专门把三档 logo 拷进标准 hicolor 图标目录cp app/assets/img/logo-32.png AppDir/usr/share/icons/hicolor/32x32/apps/localsend.png cp app/assets/img/logo-128.png AppDir/usr/share/icons/hicolor/128x128/apps/localsend.png cp app/assets/img/logo-256.png AppDir/usr/share/icons/hicolor/256x256/apps/localsend.png这一步漏掉菜单栏和桌面菜单就没有图标。配方里还有两行管运行时行为app_info: exec: localsend_app exec_args: $ # 命令行参数原样传给应用 runtime: env: XDG_DATA_DIRS: /usr/local/share/:/usr/share/:${XDG_DATA_DIRS}exec_args: $把命令行参数透传给应用外部用 URL 唤起时应用能收到。XDG_DATA_DIRS把 AppImage 内部的/usr/share放在最前面镜像内的图标和 desktop 文件能被找到末尾保留宿主机的原值兜底。两个架构的配置差在哪x86_64 和 ARM64 是两份几乎一样的 YAMLAppImageBuilder_x86_64.yml/AppImageBuilder_arm_64.yml都在support/build/appimage/下只有三处不同项x86_64 配置ARM64 配置apt.archamd64arm64include后缀libayatana-appindicator3-1:amd64等同名库换成:arm64后缀AppImage.archx86_64arm_64同样的 jammy 源、同样的两个库、同样的排除规则依赖管理不用维护两套。本地脚本只处理 x86_64ARM64 走 CI 工作流build_linux_appimage_arm64.yml。动手试一下从双击到传输免安装两步看到效果chmod x LocalSend-x86_64.AppImage ./LocalSend-x86_64.AppImage启动后托盘出现 LocalSend 图标打开主界面切到 Send 页签添加文件局域网内的设备几秒内出现在列表里。前提是同一网段且防火墙放行 53317 端口tcp 和 udp 都要——仓库 README 直接给了 ufw 和 firewalld 的现成命令照抄即可。Arch 用户如果不想手动跑 AppImageAUR 里有localsend-bin可用。Send 页签添加 4 个文件后附近设备列表里出现目标手机带设备名和指纹编号选中设备点发送进度窗口里能看到实时速度发送进度窗口显示文件级状态和 4.9 MB/s 的实时速度横向对比一下 Linux 上几种分发形态仓库本身 AppImage、deb、rpm 都在 CI 里同时构建维度AppImagedeb / rpmFlatpak / Snap跨发行版同一文件直接跑要分别维护两种包格式需先装运行时底座大托盘图标自带 libayatana直接可用依赖系统库老系统上可能缺失受沙箱权限配置影响更新方式换文件包管理器升级商店推送形态免安装用完删装进系统目录隔离安装这些坑先知道 ⚠️allow_unauthenticated: true意味着 apt 拉库时跳过 gpg 校验。拿这份 YAML 给别的项目打包时别照抄签名校验该开要开。YAML 里version: 1.18.2是硬编码的要和app/pubspec.yaml的1.18.264同步改发版时漏改桌面菜单里显示的就是旧版本。运行 AppImage 依赖 FUSE构建脚本头部注释明确要求装libfuse2。双击没反应先查/dev/fuse在不在。YAML 尾部注释掉了一组测试用例fedora-30、debian-stable、archlinux-latest 等标注原因是在 GitHub Actions 里跑不通——所以没有自动化的跨发行版启动测试兼容性实际是靠 jammy LTS 源这个选择兜底的。配方里update-information: guess只是启用 AppImageKit 的更新探测仓库内没有应用内自更新升级还是自己下载新文件替换。你该不该用适合想在任何 Linux 机器上零配置跑 LocalSend 的用户需要把同一份文件统一下发到一批机器的团队。不适合希望系统包管理器接管升级和回滚、或需要严格沙箱隔离的场景——那用仓库同样提供的 deb/rpm 更合适。判断条件目标机器是普通桌面发行版、不想装任何东西选 AppImage 最省事机器要靠包管理器统一管理选 deb/rpm。核心关键词LocalSend AppImage、跨发行版部署长尾关键词Flutter Linux 打包、appimage-builder 配置、LocalSend Linux 安装、AppImage 托盘图标、开源跨平台文件传输【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/7 3:25:11

宠物商城前后端分离实战:SpringBoot+Vue源码解析与运行部署

宠物商城系统前后端分离实战:从跑起来到改得动,一篇讲透这套可直接运行的源码怎么用我见过太多开源项目,标题写得天花乱坠,下载下来跑三天都起不来。但今天要聊的这套宠物商城网站信息管理系统,其源码落地性相当扎实&a…

2026/10/7 3:25:11

Spring Boot集成MongoDB全指南:配置、建模、索引与调优实战

1. 先说结论:为什么要把 MongoDB 接进 Spring Boot最近在折腾一个数据增长比较快的业务模块,关系型数据库在几张表 join 之后越来越吃力,尤其是文档型数据的读写,字段结构还不固定。于是把目光放到了 MongoDB 上,顺手在…

2026/10/7 3:25:11

Ubuntu鼠标闪烁抖动排查全攻略:从驱动到Wayland的完整修复指南

鼠标在 Ubuntu 桌面上闪烁、移动时不停抖动,这问题看着不大,但真的能让人瞬间暴躁。我玩 Linux 桌面这么多年,装过数不清的发行版,在 Ubuntu 20.04.1 上就结结实实被这个问题折磨过两回——一次是刚装完系统进桌面就抖&#xff0c…

2026/10/7 3:25:11

Allegro差分对属性设置:手动与自动的工程决策指南

1. 差分对不是“画两根线”那么简单:为什么属性设置决定信号完整性成败在Allegro PCB Designer里,把一对走线标上“DIFF_PAIR”四个字母,远不等于完成了差分对设计。我见过太多项目在高速信号测试阶段突然翻车——眼图闭合、串扰超标、EMI辐射…

2026/10/7 3:25:11

Spark Streaming实时模式深度解析:从微批到持续处理的架构与实践

1. Real-time Mode是什么:先分清两种“实时”在聊Spark Streaming的实时模式之前,必须先把一个被用滥的词挑明白——“实时”。很多团队跟我聊需求时张口就是“我们要实时数仓”,结果一细问,T1报表就算实时。真正做流计算的工程师…

2026/10/7 3:20:11

云上SOC建设实战:从被动响应到主动威胁狩猎的转型之道

云上安全运营中心(SOC)建设:从被动防御到主动狩猎1. 项目概述1.1 我为什么想写这个话题做云上安全这几年,我最深的一个感受是:很多团队的安全运营还停留在"告警响了才动"的阶段。告警中心积压了几千条未处置的告警,SIEM…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑