作为独立开发者,写完代码、发个 deb 包,似乎就完成了任务。但现实往往是:用户要在不同的 Linux 发行版里折腾依赖、解决环境冲突,最终因为“装不上”而流失。

社区开发者 @米饭虚拟机  在分享了自己的软件后,被小伙伴催更“如意玲珑包”。在踩坑填坑后,他总结了一套极简流程。今天,我们就从他的实战出发,看看如何通过补齐“玲珑打包”这项技能,让你的软件在多发行版生态中丝滑落地。

 

对于独立开发者而言,写代码只是第一步,让用户“顺畅地用上”,才是产品闭环的最后一公里。

如意玲珑(Linyaps)是由开放原子开源基金会孵化及运营的开源项目,通过轻量级容器化技术,让应用在 deepin、UOS、Debian、Ubuntu、Arch 等多个 Linux 发行版上保持一致运行。容器化隔离和写时复制机制,兼顾了效率与安全。

对 deepin 用户来说,玲珑已经是“老朋友”了。deepin 25 将玲珑作为应用分发的重要基础设施,系统默认集成运行环境。社区里也有越来越多的开发者主动把软件打成玲珑包,让好用的工具不再被发行版边界卡住。

下面以 Motrix 为例,只需 4步,完整走一遍流程。

 

第一步:把环境准备好

deepin 和 UOS 部分版本已经预装如意玲珑,请先执行 ll-cli --version查看;如果你的系统里还没有,执行:

sudo apt update && sudo apt install linglong-bin linglong-builder -y

Arch 用户则用:

sudo pacman -Syu linyaps

其他发行版的安装方式,可以在如意玲珑官网文档中找到 https://linyaps.org.cn/。环境就绪后,新建一个工作目录,在里面创建 linglong 文件夹和 linglong.yaml 文件:

mkdir linglong && touch linglong.yaml

接下来以 Motrix 为例,把准备好的 deb 包放进 linglong 目录并解包。用 GUI 工具解包会更方便。

解包后,删掉 deb 文件和 DEBIAN 文件夹——DEBIAN 里的控制信息在玲珑打包中用不上。

 

第二步:改造目录结构,这是最容易踩坑的地方

玲珑对应用的文件布局有明确要求:主程序目录必须放在 /opt/apps/包名/files/ 下,否则构建时会直接报错。

以 Motrix 为例:

原来的 /opt/Motrix/* 需要整体改为 /opt/apps/app.agalwood.motrix/files/*

原来的结构

改动后的结构,符合玲珑打包标准

 

这里有两个细节值得留意:

  • 包名推荐使用倒置域名(rDNS 风格),比如 app.agalwood.motrix,并且全部小写;

  • usr 文件夹的结构可以保持原样,但里面的.desktop 文件需要跟着改。

.desktop 文件的关键改动在于 Exec 和 Icon:Exec 的路径要对应新的文件结构,Icon 填图标名。同时,.desktop 文件的文件名也要改成与包名一致:

进入linglong目录,.desktop 文件的文件名改为对应的包名。

cd linglong

mv ./usr/share/applications/motrix.desktop ./usr/share/applications/app.agalwood.motrix.desktop

注意 /usr 前面的那个点,不要漏掉。

 

第三步:写好 linglong.yaml,构建成功一大半

linglong.yaml 是玲珑打包的核心配置文件。这里贴出了 Motrix 的完整配置,可以直接对照自己的软件修改:

version: '1'

package:

  id: app.agalwood.motrix

  name: motrix

  version: 2.0.1.0

  kind: app

  description: |

    motrix,基于aria2的下载器

  architecture: x86_64

  channel: main

command: [/opt/apps/app.agalwood.motrix/files/motrix]

base: org.deepin.base/25.2.2

sources:

  - kind: git

    url: https://github.com/agalwood/Motrix.git

    commit: 7eecee9a6138cb3610d3dc88f9c5223e540476f4

    version: main

build: |

  cp -a /project/linglong/opt/apps/app.agalwood.motrix/files/. "${PREFIX}/"

  install -Dm644 /project/linglong/usr/share/applications/app.agalwood.motrix.desktop \

    "${PREFIX}/share/applications/app.agalwood.motrix.desktop"

  mkdir -p "${PREFIX}/share/icons/hicolor"

  cp -a /project/linglong/usr/share/icons/hicolor/. "${PREFIX}/share/icons/hicolor/"

buildext:

  apt:

    depends:

      [libgtk-3-0, libnotify4, libnss3, libxss1, libxtst6, xdg-utils, libatspi2.0-0, libuuid1, libsecret-1-0]

作者特别标出了几个容易翻车的点:

  • version 必须是四元组(a.b.c.d),写成三段会报错;

  • command的值必须用中括号 [ ] 括起来,哪怕只有一条命令;

  • architecture 按架构填写:amd64 写 x86_64,arm64 写 arm64,龙架构新世界写 loong64;

  • sources 必须填,kind 推荐 git,url 和 commit 可以随便填,version 推荐 main 或 master;打包时加 --offline 参数会跳过 sources 的读写;

  • buildext.apt.depends 里列的是构建时需要的依赖包,按自己软件的实际情况增减即可;不知道依赖可以不填。

 

第四步:构建、导出,然后安装

以上文件就位后,返回上一层级目录,执行构建:

cd ..

ll-builder build --offline

编译中

出现 Build completed successfully 说明编译成功。接着导出成玲珑包,加上 -z zstd 可以让产物更小:

ll-builder export -z zstd

安装:

ll-cli install ./*.uab

执行:

ll-cli install app.agalwood.motrix

注意:普通用户安装时需要输入密码。

 

玲珑的意义,不止于“多一种格式”

对普通用户来说,玲珑包意味着同一个应用可以在 deepin、UOS、Debian、Ubuntu、Arch 上获得一致的运行体验,不用再为不同发行版找不同的安装方式。

对社区开发者来说,把软件打包成如意玲珑,表面上是多学了一门构建工具,实际上是补全了在 Linux 生态中的“分发短板”——这是让你的作品被更多 Linux 用户看见、用上的最短路径之一。

一个架构、一次构建,全平台分发。如果你手里也有一个“想让它跑在各大 Linux 发行版上”的软件,不妨从这篇打包教程开始。