以前,Linux. 因为发行版众多,给不同的发型版适配打包,非常麻烦。
同样一套代码,在不同的发行版上编译出来以后,调用的动态连接库不一样,于是得分别编译。而不同的发行版上面,使用的打包工具,也是千差万别,需要分别打包,手动编写各种spec、debs等等。
现在有了AppImage.,这种状况一下子就改观了许多。
AppImage文件的使用
AppImage文件,是一个包含了所有依赖的二进制包。我们下载了一个AppImage以后,只需要两步,就可以让程序运行起来。
假如我们下载了一个apvlv.AppImage程序。那么第一步,我们只需要给这个文件增加可执行权限:
chmod +x apvlv.AppImage
第二步,执行:
./apvlv.AppImage
不用root权限,不用安装其它依赖。只需要一个AppImage,就是这么简单。
难怪Linus大神都情不自禁地说:“这简直太酷了。”
AppImage的创建
如果我们是一个开发者,如何给用户创建AppImage呢?
也很简单,使用appimage-builder就好。
部署appimage-builder环境
先安装appimagetool:
sudo wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /usr/local/bin/appimagetool
如此,就直接下载了一个可以直接使用的appimagetool,加上可执行权限就可以使用了。
或者,也可以从Docker里取一个:
cd /opt/; sudo chmod +x appimagetool; sed -i ‘s|AI\x02|\x00\x00\x00|’ appimagetool; sudo ./appimagetool --appimage-extract
sudo mv /opt/squashfs-root /opt/appimagetool.AppDir
sudo ln -s /opt/appimagetool.AppDir/AppRun /usr/local/bin/appimagetool
先使用pip安装appimage-builder:
pip install appimage-builder
安装必须的patchelf二进制文件,比如Fedora中使用:
sudo dnf install patchelf
生成AppImage包
先创建一个AppDir目录:
mkdir AppDir
执行appbuilder --generate:
appbuilder --generate
例如,现在生成一个apvlv的AppImage,期间会运行apvlv程序,以便对程序调用进行分析。
~/$ appimage-builder --generate
INFO:Generator:Searching AppDir
? ID [Eg: com.example.app]: apvlv
? Application Name: apvlv
? Icon: application-vnd.appimage
? Executable path relative to AppDir [usr/bin/app]: /usr/bin/apvlv
? Arguments [Default: $@]: $@
? Version [Eg: 1.0.0]: 0.4.1
? Update Information [Default: guess]: guess
? Architecture: x86_64
INFO:AppRuntimeAnalyser:/usr/bin/strace -f -E LD_LIBRARY_PATH= -e trace=openat --status=successful /usr/bin/apvlv $@
INFO:AppRuntimeAnalyser:Reading PT_INTERP from executables
INFO:Generator:Recipe generation completed.
此时,在当前目录下,生成了AppImageBuilder.yml。
然后,生成AppImage,中途可能需要连网下载一些依赖文件:
appimage-builder --recipe AppImageBuilder.yml
如果不进行测试,还可以加上–skip-tests选项。
appimage-builder --recipe AppImageBuilder.yml --skip-tests
一个可以分发给用户,让用户只需要直接执行就可以的apvlv-0.4.1-x86_64.AppImage就制作完成了。
如果需要对最终生成的AppImage进行微调,可以使用–skip-appimage来阻止最后的AppImage生成,进入AppDir目录进行更改,然后再生成最终的AppImage。