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 理解成一个饭盒饭菜、餐具、筷子全密封在一盒里打开就能吃不用自己在家备灶台依赖环境。它运行时先把自己挂载成一个只读文件系统里面的动态库是打包时带进来的跟宿主机恰好装了什么版本无关。这就是单文件 Linux 分发最直接的形态一个 LocalSend AppImage 文件Ubuntu、Fedora、Arch 上直接运行不找包管理器要任何东西。拆开来看它由哪几块组成整条生产线有五处配合其中三处在 support/ 目录下。app/linux/——Linux 平台的原生构建骨架这是 Flutter 的 Linux 平台目录一个标准 CMake 工程main.cc 是入口my_application.cc 负责窗口与托盘。需要它是因为 Flutter 的跨平台最终要落到各平台的真实构建系统上产物不是单文件而是 build/linux/x64/release/bundle/ 整个目录可执行文件、动态库、.desktop 文件也就是下一步的原料。compile_linux_appimage.sh——串起全流程的 shell 脚本一个 40 行的脚本负责把清理、编译、打包完整做一遍。作者用 submodules/ 子模块锁定 Flutter 版本并在干净的 /tmp 里编译保证产物可复现、不带本地残留。核心步骤是rm -rf /tmp/build cp localsend /tmp/build -r pushd /tmp/build git submodule update --init alias fluttersubmodules/flutter/bin/flutter flutter clean flutter pub get flutter pub run build_runner build -d flutter build linux mkdir AppDir cp -r build/linux/x64/release/bundle/* AppDir cp support/build/appimage/AppImageBuilder_x86_64.yml AppImageBuilder.yml appimage-builder注意 AppDir 里拷的是整个 bundle 目录而不是单个可执行文件AppImage 打包需要完整目录结构。AppImageBuilder_x86_64.yml——x86_64 依赖隔离配方这是打包的核心appimage-builder 照它搭建 AppDir拉哪些 Ubuntu 包、排掉哪些、运行时设什么环境变量。apt 段锁定 Ubuntu jammyinclude 只列了两个库libayatana-appindicator3-1系统托盘和 librsvg2-commonSVG 渲染。这就是跨发行版构建的关键一环下一节带你看完整。AppImageBuilder_arm_64.yml——ARM64 孪生配方内容和 x86_64 版几乎一样实质差别只有两处apt.arch 写成 arm_64include 的库后缀改成 :arm64。同一份源码因此也能给树莓派或 ARM 服务器产出 AppImage。build_appimage.yml——复现全流程的 CI把手工脚本变成工作流build_appimage 任务跑在 ubuntu-22.04 上和配方里的 jammy 基线对齐装托盘开发库和 libfuse2flutter build linux 之后做两件容易漏的事——把 32/128/256 三个尺寸的图标拷进 AppDir/usr/share/icons/hicolor/配方声明了 icon: localsend少了它任务栏图标就缺失再把配方复制到仓库根目录调用 build-appimage 动作出包。跟着一份配方走一遍配方文件不算短你打开 AppImageBuilder_x86_64.yml 会发现真正重要的就四段。最上面是 version: 1 和 script 段内容只有一条缺 mksquashfs 就装一个。这是 CI 的兼容措施——appimage-builder 最后一步要把 AppDir 压缩成 squashfsCI 镜像默认没有这个工具。接着是 AppDir.app_info写的是应用身份id、name、icon、versionexec: localsend_app 告诉 AppImage 该拉起哪个可执行文件exec_args: $ 把用户输入的命令参数原样透传给应用拖文件到 AppImage 上这类用法靠它才成立。apt 段是花了心思的地方十条 sourceline 全部钉在 jammy22.04而不是最新发行版上apt: arch: - amd64 allow_unauthenticated: true # 跳过 GPG 校验避免密钥环不全的 CI 镜像上构建中断 sources: - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted # ... 其余共 9 条覆盖 jammy 的 updates/universe/multiverse/backports/security ... include: - libayatana-appindicator3-1:amd64 # 系统托盘组件缺了它托盘图标出不来 - librsvg2-common:amd64 # SVG 图标渲染应用矢量图标靠它 exclude: - adwaita-icon-theme:* # 不带发行版主题避免覆盖应用自带图标为什么选 jammy 不选更新的版本它是 LTS仓库稳定维护五年库版本都被充分测试过。为什么只 include 两个库应用真正特殊的依赖就是托盘和 SVG 渲染这两处Flutter 运行时其余部分GTK 之类会作为它们的传递依赖自动带进来作者把它们收敛到两个体积和版本漂移都可控。runtime 和 files 两段处理看得见的与看不见的runtime: env: # AppImage 挂载点是隔离前缀不指回宿主 /usr/share应用就看不到系统 MIME 与主题信息 XDG_DATA_DIRS: /usr/local/share/:/usr/share/:${XDG_DATA_DIRS} files: include: [] exclude: - usr/share/man # 手册页对传输工具无用排除省体积 - usr/share/doc/*/README.* - usr/share/doc/*/changelog.* - usr/share/doc/*/NEWS.* - usr/share/doc/*/TODO.* AppImage: arch: x86_64 update-information: guess # 尝试自动识别版本号但没有配置真正的更新仓库XDG_DATA_DIRS 往前插两个标准目录思路是沙箱保持隔离的同时让应用读得到宿主的 MIME 和主题信息。files 的 exclude 把库带进来的手册页和文档文本排掉省出几 MB 且不影响运行。结尾的 update-information: guess 只是把版本号写进产物这里埋着下一节要说的取舍。踩过的坑与做出的取舍被排除的方案项目在 app/linux/packaging/ 下其实保留了 deb 和 rpm 的打包配置但托盘库有 appindicator 和 ayatana 两套血统各发行版版本互不一致本地编译经常报差一点的错这是 AppImage 成为 Linux 主形态的根本原因。Flatpak 和 Snap 同样能隔离依赖前者要求用户先装运行时后者沙箱更重而 LocalSend 作为文件传输工具要频繁访问本地文件和本地网络和重沙箱的摩擦更多。打包方式依赖位置不作主形态的原因deb/rpm系统包仓库各发行版本漂移托盘库两套血统Flatpak / Snap独立运行时或商店沙箱重需先装运行时妨碍文件与局域网访问AppImage随产物自带选中免安装、下载即运行、版本可控当前的局限一是没有真正的自动更新update-information: guess 只把版本号写进产物没有指向更新仓库检查更新不生效目前的应对是让用户从发布页下载新文件替换应用内的版本显示方便对照。二是 FUSE 是运行前提宿主系统没有 libfuse2 时 AppImage 无法挂载只能退到./LocalSend.AppImage --appimage-extract解压后运行——这是官方兜底路径但用户要多一步操作。按角色给三条建议使用者先看文件名里的架构x86_64 或 arm_64chmod x后直接执行系统没有 FUSE 就加--appimage-extract参数运行一样能用。二次开发者仓库地址为 git clone https://gitcode.com/GitHub_Trending/lo/localsend 要增减依赖只改两份 AppImageBuilder_*.yml 的 include新增动态库后重跑 appimage-builder它报的缺依赖错误会告诉你还缺什么。部署运维单文件 Linux 分发产物放到任意内网文件服务器即可分发和回滚都靠替换文件完成版本号和架构直接写在文件名里全程没有安装环节。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表