
LocalSend AppImage 打包实战从源码到多架构 Linux 便携包的完整流程【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend终点只有一个文件.AppImage。免安装、不挑发行版丢进任意 Linux 桌面双击就能跑。下面把 LocalSend AppImage 从源码做到成品的过程拆开讲环境怎么备、配方怎么写、x86_64 和 ARM64 怎么切换。AppImage 是什么跟 Snap、deb 差在哪AppImage 的本质是一句话把程序和它需要的库压进一个文件运行时通过 FUSE 在内存里挂载出根目录再启动。你可以把它理解成 Linux 版的自包含 dmg——机器上什么都不用预装。这也是 LocalSend 选它的原因一个局域网传文件的小工具用户装完还得折腾 snapd 或者 apt 源体验上就输了。维度AppImagedeb / rpmSnapFlatpak系统侧前置条件无包管理器snapd 常驻flatpak 运行时依赖策略自己带吃系统仓库基座 snap共享 runtime 镜像更新方式换掉文件走包管理器自动自动拷到 U 盘能用能不能不能不能适合下载即用场景●○○○ 从零到成品准备、配方、构建、验证准备。装两类依赖Flutter 编译侧的构建链加上 AppImage 运行侧的 libfuse2 和打包工具。sudo apt install curl clang cmake libgtk-3-dev ninja-build \ libayatana-appindicator3-dev libfuse2 squashfs-tools # appimage-builder 本体从 AppImageCrafters 的 releases 页拿 1.1.0 版本 # 加执行权限后放到 /usr/local/bin把仓库拉下来注意 Flutter SDK 是以子模块形式放在项目里的不初始化会直接编译失败。git clone https://gitcode.com/GitHub_Trending/lo/localsend cd localsend git submodule update --init配置。打包配方在 AppImageBuilder_x86_64.yml骨架就四块script打包前的自检命令、AppDir装什么、apt连带哪些库、AppImage输出架构和更新信息。它不关心编译只关心把 AppDir 连同依赖压成一个文件。构建。先出 Linux 二进制再把 release 产物搬进 AppDir交给 appimage-builder。flutter pub get flutter pub run build_runner build -d flutter build linuxmkdir AppDir cp -r build/linux/x64/release/bundle/* AppDir # 主程序 资源 cp support/build/appimage/AppImageBuilder_x86_64.yml AppImageBuilder.yml appimage-builder # 产出 LocalSend-1.18.2-x86_64.AppImage懒得一步步敲的话仓库里有 compile_linux_appimage.sh在support/scripts目录下执行即可它把上面所有步骤都包了还会把成品拷回仓库根目录。验证。最直接的办法就是跑起来再解包看一眼内容。./LocalSend-1.18.2-x86_64.AppImage # 等价于用户双击 ./LocalSend-*.AppImage --appimage-extract # 解压出 squashfs-root 检查内部换架构。ARM64 基本不用动代码换成 AppImageBuilder_arm_64.yml其中apt.arch改arm64、文件尾AppImage.arch改arm_64然后在 ARM64 机器或容器里跑同一套流程就行。配方里三个字段改错一个就出事exec配错的代价是无声失败。AppRun 本质上只是个负责拉起exec的壳子名字写错时图标照常出现、双击不报错但窗口就是不来——这类问题排查成本极高所以exec: localsend_app要和bundle目录里的可执行文件名逐字对上。顺手看一眼exec_args: $它是命令行参数的透传开关不写的话用户带进来的参数会被壳子吞掉。apt.sources钉死 jammy是在给随便哪个发行版下保证。如果不对源做限定依赖会按构建机当前发行版解析产物能不能跑就全看缘分。钉在 Ubuntu 22.04 之后包等于公开承诺基线库版本 22.04新系统必能跑老系统最多补装一两个库。旁边那个allow_unauthenticated: true是为了让 multiverse 这类无签名源能通过校验省了它构建会卡在 GPG 检查上。files.exclude四行看着不起眼是省体积的固定收益。man 页和 doc 目录会随每个 apt 依赖被拖进来对纯工具包来说是纯垃圾usr/share/man和usr/share/doc下的 README/NEWS/TODO 全砍掉。文件尾的update-information: guess顺便说一下它决定 AppImage 内置的更新检查行为LocalSend 走手动换文件路线所以guess就够用。踩坑实录这四个症状见得最多直接运行报 FUSE 相关错误大概率是缺 libfuse2。新一些的发行版比如 24.04默认只带 fuse3而 AppImage 老运行时吃的是 libfuse2 接口apt install libfuse2之后就能开。构建阶段报mksquashfs: command not found这正好解释了配方第一行为什么写着which mksquashfs || apt install squashfs-tools——CI 镜像不一定预装它那行脚本就是兜底。手动构建时先装 squashfs-tools 再跑。菜单图标变成灰色方块、应用名丢失通常是图标名对不上app_info.icon指向localsend那AppDir/usr/share/icons/hicolor/下对应尺寸的 png 就必须真的存在。项目 CI 会把 32/128/256 三档 logo 分别拷进规定目录你只拷二进制忘了图标症状就是它。一切看起来正常启动却莫名崩溃。这时用--appimage-extract解包对squashfs-root里的可执行文件跑ldd | grep not found缺哪个库一目了然再把库名加进配方的apt.include重新打包。 把包做小、发出去减体积的主杠杆只有一个apt.include保持白名单。配方里只显式列了两个库——托盘图标用的libayatana-appindicator3-1和 SVG 渲染用的librsvg2-common其余靠传递依赖覆盖。想确认包内部哪块大解包后du -sh扫一遍squashfs-root/usr/lib就行多数情况下收益最大的是继续砍不用的传递依赖而不是动 squashfs 压缩参数。发出去这头版本号和app/pubspec.yaml对齐产物命名遵循LocalSend-{版本}-{架构}.AppImage如LocalSend-1.18.2-x86_64.AppImage用户一眼能看出新旧。项目 CI 里有两个对应 workflowx86_64 和 ARM64 各一个关键 step 摘出来是这样的# 从项目 Linux workflow 中摘出的关键步骤完整版本在仓库里 - run: sudo apt install -y libgtk-3-dev ninja-build \ libayatana-appindicator3-dev libfuse2 - run: flutter build linux # working-directory: app - run: | mkdir AppDir cp -r app/build/linux/x64/release/bundle/* AppDir/ # 图标按 hicolor 规格拷入 32/128/256 三档目录 - uses: AppImageCrafters/build-appimage with: recipe: ./AppImageBuilder.yml # 最后一步上传 artifact 作为发布产物正式发布前建议再补一道签名gpg --detach-sign生成独立签名文件让用户下载后能验证包没被换过。打包这件事的标准只有一条用户从不需要翻 README。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考