Linux 有非常多的发行版,有太多不同的包管理方式,要接触非常多的打包方式,如 Debian (deb)、ReadHat 系列 (rpm)、Arch (pkg.tar.zst) 等.....
当然,还有一些容器方案像:Flatpak、Snap、玲珑
而 AppImage 呢,则非容器,而是将许多依赖包含在一个文件中,更像是一个经过压缩且便携式的可执行文件,可以随便挪动并使用,它会在第一次启动时候临时解压和挂载资源,所以启动时间稍微慢,但它有缓存机制,后续启动会加快。
既然它是非容器,那么也会有它的问题,没有专门的隔离机制,要把它当原生程序看待,留意安全问题。
如果你厌倦了为各种 "发行版" 打包,那么就可以尝试下 AppImage 方案来为 "Linux" 统一打包。
它打包的方式很简单,只需要下载一个 appimagetool 然后手动新建一个 AppDir 目录,并建立以下类似结构:
AppDir
├── AppRun # 启动脚本
├── MyApp.desktop # desktop 相关文件
├── MyIcon.png # 图标
└── usr # 假设需要打包的二进制资源
├── bin
│ └─ MyApp # 可执行文件
..... # 按需添加
其中 AppRun 是必须的启动脚本,里面可以编写:
#!/bin/bash
export LD_LIBRARY_PATH="$(dirname "$0")/usr/lib:$(dirname "$0")/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH"
exec "$(dirname "$0")/usr/bin/MyApp"
1.这里为什么会有 dirname $0 ?因为需要考虑到 appimage 文件可能位于任何路径所以路径不能写死,而这个命令相当于返回 AppRun 脚本所在目录的路径。
2.设置 LD_LIBRARY_PATH 的作用:让程序优先从打包的文件中查找依赖库
而 MyApp.desktop 我们可以这样编写:
#!/usr/bin/env xdg-open
[Desktop Entry]
Name=MyApp
Exec=MyApp
Icon=MyIcon
Type=Application
Categories=Utility;
以上字段中 Icon 这里会默认找 MyIcon.png 的图标, 而 Name 为应用名称,Exec 指向程序启动文件,Type 是应用的类型,Categories: 应用分类。
接下来使用 appimagetool 命令来对 AppDir 进行打包
appimagetool AppDir路径
就可以在当前路径下得到一个 .appimage 可执行文件了,只需要给它给以执行权限即可。
appimage 自带了一个内置的解压选项,可以使用: **.appimage --appimage-extract 会解压出一个叫 squashfs-root 的目录,里面便是打包的相关文件。