ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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),仅供参考
返回列表