共计 13532 个字符,预计需要花费 34 分钟才能阅读完成。
AppImage 是一种在 Linux 零碎中用于散发便携式软件,且不须要超级用户权限来装置它们的格局。它还容许 Linux 的上游开发者来散发他们的程序而不必思考不同 Linux 发行版间的区别。AppImage 的核心思想是一个文件即一个应用程序,每个 AppImage 都蕴含应用程序以及利用程序运行所需的所有文件。
AppImage 工具介绍
像 Linux 自身一样,AppImageKit 是开源的。
实用于所有相当古代的 Linux 桌面发行版。
简略
AppImage 的核心思想是:一个应用程序 = 一个文件。每个 AppImage 都蕴含应用程序以及利用程序运行所需的所有文件。换句话说,除了操作系统自身的根底组件,Appimage 不须要依赖包即可运行。
牢靠
AppImage 格局是上游利用打包的现实抉择,这意味着你能够间接从开发者那里获取软件,而不须要任何两头步骤,这完全符合开发者用意。十分迅速。
疾速
AppImage 利用能够间接下载并且运行,无需装置,并且不须要 root 权限。
AppImage 工具比照
比照多种软件格局的劣势和劣势!
与 deb 和 rpm 比照
- 劣势
- AppImage 格局的利用可跨发行版运行,传统格局不可用或比拟难。
- AppImage 格局不须要装置即可运行,可在 $HOME 分区运行,节俭更分区空间。
- AppImage 无需 root 权限,辞别输出明码时代。
- AppImage 蕴含利用依赖,可不受软件仓库制约,疾速散发利用版本且不毁坏零碎依赖。
- AppImage 提供多种打包形式,即可手动打包,也可脚本打包。
- 劣势
- AppImage 格局会造成库的冗余且体积偏大,戏称为“零碎装置了一万个 libc”。
- AppImage 不受查看,如果有来源不明的人打包,可能会带来平安危险。
- 运行一个旧的 AppImage 软件所带的仍旧是旧版本的依赖库,可能会带来危险。
与 snap 和 flatpak 比照
- 劣势
- AppImage 无需运行时,装置 snap 和 flatpak 软件装置其运行时。
- AppImage 格局不须要装置即可运行,可在 $HOME 分区运行,节俭更分区空间。
- AppImage 无需 root 权限,辞别输出明码时代。
- AppImage 不须要软件仓库,当然也能够有,易于流传。
- AppImage 对华人敌对,包含官方网站和官网文档都曾经有对应的中文反对。
- 劣势
- 没有沙箱机制。
- 没有商业公司反对,导致开发了十多年才具备影响力。
- 对某些定制化装置的发行版不敌对,比方 gentoo、archlinux 等。
AppImage 目录构造
须要留神 AppImage 所需的文件以及目录构造!
应用 AppImage 系列工具的前提就是,你所编写的程序我的项目或者工具依赖格局必须合乎 AppDir 的目录要求,大抵目录构造如下所示。
AppDir
└── AppRun
└── your_app.desktop
└── your_app.png
└── usr
├── bin
│ └── your_app
├── lib
└── share
├── applications
│ └── your_app.desktop
└── icons
└── <theme>
└── <resolution>
└── your_app.png
- AppRun 文件
- 必须要有
- 启动主负载应用程序
- 其中 AppRun 文件是程序的启动入口点文件,须要有可执行权限。
- 在 AppImageKit 我的项目中提供了一个 AppRun.c 的实现,但咱们能够应用语言,比方 shell 的实现,也能够仅应用与次要可执行文件的符号链接。
- your_app.desktop 文件
- 必须要有
- 相似于 Windows 零碎的快捷方式,即双击即可运行。
- 咱们这里的 [your_app].desktop 文件将显示在桌面上,可应用链接的形式存在。
- 编写的格局能够参考:https://specifications.freede… spec/latest/ar01s06.html 这个网站,最简略的办法就是找一个改吧改吧。
[Desktop Entry]
Name=Hypnos
Exec=hypnos %F
Icon=hypnos
Type=Application
Categories=Audio;AudioVideo;
Comment=Music Player and Library
MimeType=inode/directory;audio/flac;
Name[en]=Hypnos
Terminal=false
StartupNotify=true
NoDisplay=false
- your_app.png 文件
- 非必须
- 提供程序软件包的桌面显示图案。
- Version 文件
- 非必须
- 用于显示程序软件包所对应的版本信息。
appimagetool 命令应用
介绍 AppImage 工具的应用格局和常用命令参数。
打包命令应用
appimagetool 命令用于把现有的 AppDir 目录生成一个 AppImage 程序。
Usage:
appimagetool [OPTION...] SOURCE [DESTINATION] - Generate, extract, and inspect AppImages
Help Options:
-h, --help Show help options
Application Options:
-l, --list List files in SOURCE AppImage
-u, --updateinformation Embed update information STRING; if zsyncmake is installed, generate zsync file
-g, --guess Guess update information based on Travis CI or GitLab environment variables
--bintray-user Bintray user name
--bintray-repo Bintray repository
--version Show version number
-v, --verbose Produce verbose output
-s, --sign Sign with gpg[2]
--comp Squashfs compression
-n, --no-appstream Do not check AppStream metadata
--exclude-file Uses given file as exclude file for mksquashfs, in addition to .appimageignore.
--runtime-file Runtime file to use
--sign-key Key ID to use for gpg[2] signatures
--sign-args Extra arguments to use when signing with gpg
打包文件应用
如果咱们运行一个由 AppImageKit 工具构建的程序,那么其会附加以下参数,对应不同的参数会提供一些额定的个性和性能。
# usage
./appimagetool-x86_64.AppImage some.AppDir
pkg2appimage 工具应用
pkg2appimage 工具实用于将 deb 格局的包变成 appimage 的独立可执行文件!
如果曾经有了对应的二进制文件,不论是 zip 归档文件、.deb 格局的文件还是 ppa 源上的文件,咱们只须要编写一个 .yml 格局的形容文件,而后应用 pkg2appimage 工具来运行它,就会帮忙咱们转换生成一个 AppImage 的独立文件,是不是非常简单呢?yml 形容文件通知 pkg2appimage 从哪里取得所须要的内容,以及如何将它们转换为 AppImage。
# 执行形式
$ bash -ex ./pkg2appimage recipes/XXX.yml
如果你只是看到了简答,那么你就太年老了,你不晓得这个 yml 格局的配置文件到底有多糟心。真的,看了官网文档中的配置文件介绍,以及对于官网仓库的示例软件对于 yml,心里有些懵逼。不过,等多看几次之后,就会发现还是不难写的,只是须要咱们再呈现谬误的时候,可能及时调整配置文件,就能够失常打出咱们须要的独立文件。
上面咱们就一起看下,yml 文件的编写内容吧!正如咱们所看到的那样,.yml 文件由三个局部组成,别离是主体局部、依赖局部和脚本局部。
app: zstd # 软件名称
binpatch: true # chdir()
overwrite: true # union file system
ingredients: # 依赖关系;包的内容从哪里来
dist: bionic
package: zstd
sources:
- deb http://archive.ubuntu.com/ubuntu/ bionic main universe
script:
- cat > ./zstd.desktop <<EOF
- [Desktop Entry]
- Type=Application
- Terminal=true
- Name=zstd
- Exec=zstd
- Icon=transmission-tray-icon.png
- Categories=Development;
- EOF
- cat > ./AppRun <<EOF
- #!/bin/sh
- HERE=$(dirname $(readlink -f "${0}"))
- export LD_LIBRARY_PATH="${HERE}"/usr/lib:$PATH
- "${HERE}"/usr/bin/zstd $@
- EOF
- chmod a+x ./AppRun
# 执行如下命令即可生成 zstd 的独立程序
$ pkg2appimage ./zstd-appimage.yml
- The overall section
- 必须存在
- 蕴含应用程序的名称
- 该名称必须与主入口文件的包名称匹配
app: zstd
- The ingredients section
- 必须存在
- 形容如何获取进入 AppImage 的二进制内容
- 可蕴含 zip 归档文件、.deb 格局的文件还是 ppa 源上的文件
# Using ingredients from a binary archive
ingredients:
script:
- DLD=$(wget -q "https://api.github.com/repos/atom/atom/releases/latest" -O - | grep -E "https.*atom-amd64.tar.gz" | cut -d'"' -f4)
- wget -c $DLD
- tar zxvf atom*tar.gz
# Using ingredients from a debian repository
ingredients:
dist: xenial
sources:
- deb http://archive.ubuntu.com/ubuntu/ xenial main universe
- deb http://download.opensuse.org/repositories/isv:/KDAB/xUbuntu_16.04/ /
# Using ingredients from an Ubuntu PPA
ingredients:
dist: xenial
sources:
- deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
ppas:
- geany-dev/ppa
# Using local deb files
ingredients:
dist: xenial
sources:
- deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
debs:
- /home/area42/kdenlive.deb
- /home/area42/kdenlive/*
# Excluding certain packages
ingredients:
dist: xenial
packages:
- multisystem
- gksu
sources:
- deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
- deb http://liveusb.info/multisystem/depot all main
exclude:
- qemu
- qemu-kvm
- cryptsetup
- libwebkitgtk-3.0-0
- dmsetup
# Pretending certain versions of dependencies being installed
ingredients:
dist: xenial
sources:
- deb http://archive.ubuntu.com/ubuntu/ xenial main universe
ppas:
- otto-kesselgulasch/gimp-edge
pretend:
- libcups2 1.7.2-0ubuntu1
# Arbitrary scripts in the ingredients section
ingredients:
script:
- URL=$(wget -q https://www.fosshub.com/JabRef.html -O - | grep jar | cut -d '"' -f 10)
- wget -c "$URL"
- wget -c --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jre-8u66-linux-x64.tar.gz
- The script section
- 必须存在
- 脚本局部可能蕴含将二进制内容转换为适宜于生成 AppImage 的 AppDir 所需的任意 shell 命令
# The script section needs to copy ingredients into place
ingredients:
dist: xenial
sources:
- deb http://archive.ubuntu.com/ubuntu/ xenial main universe
script:
- DLD=$(wget -q "https://github.com/feross/webtorrent-desktop/releases/" -O - | grep _amd64.deb | head -n 1 | cut -d '"' -f 2)
- wget -c "https://github.com/$DLD"
script:
- mv opt/webtorrent-desktop/* usr/bin/
- sed -i -e 's|/opt/webtorrent-desktop/||g' webtorrent-desktop.desktop
# The script section needs to copy ingredients into place
ingredients:
script:
- wget -c "https://telegram.org/dl/desktop/linux" --trust-server-names
- tar xf tsetup.*.tar.xz
script:
- cp ../Telegram/Telegram ./usr/bin/telegram-desktop
# The script section needs to copy icon and .desktop file in place
script:
- tar xf ../fritzing* -C usr/bin/ --strip 1
- mv usr/bin/fritzing.desktop .
# The script section needs to copy icon and .desktop file in place
script:
- # Workaround for:
- # https://bugzilla.mozilla.org/show_bug.cgi?id=296568
- cat > firefox.desktop <<EOF
- [Desktop Entry]
- Type=Application
- Name=Firefox
- Icon=firefox
- Exec=firefox %u
- Categories=GNOME;GTK;Network;WebBrowser;
- MimeType=text/html;text/xml;application/xhtml+xml;
- StartupNotify=true
- EOF
# The script section needs to copy icon and .desktop file in place
script:
- cp ./usr/share/applications/FBReader.desktop fbreader.desktop
- sed -i -e 's|Exec=FBReader|Exec=fbreader|g' fbreader.desktop
- sed -i -e 's|Name=.*|Name=FBReader|g' fbreader.desktop
- sed -i -e 's|Icon=.*|Icon=fbreader|g' fbreader.desktop
- mv usr/bin/FBReader usr/bin/fbreader
- cp usr/share/pixmaps/FBReader.png fbreader.png
上面示例是 pip 这个工具的官网仓库中给出的 yml 配置文件。
# Converting Python applications packaged with pip
app: mu.codewith.editor
ingredients:
dist: xenial
sources:
- deb http://us.archive.ubuntu.com/ubuntu/ xenial xenial-updates xenial-security main universe
- deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main universe
- deb http://us.archive.ubuntu.com/ubuntu/ xenial-security main universe
packages:
- python3.4-venv
script:
- wget -c https://raw.githubusercontent.com/mu-editor/mu/master/conf/mu.codewith.editor.png
- wget -c https://raw.githubusercontent.com/mu-editor/mu/master/conf/mu.appdata.xml
script:
- cp ../mu.codewith.editor.png ./usr/share/icons/hicolor/256x256/
- cp ../mu.codewith.editor.png .
- mkdir -p usr/share/metainfo/ ; cp ../mu.appdata.xml usr/share/metainfo/
- virtualenv --python=python3 usr
- ./usr/bin/pip3 install mu-editor
- cat > usr/share/applications/mu.codewith.editor.desktop <<EOF
- [Desktop Entry]
- Type=Application
- Name=Mu
- Comment=A Python editor for beginner programmers
- Icon=mu.codewith.editor
- Exec=python3 bin/mu-editor %F
- Terminal=false
- Categories=Application;Development;
- Keywords=Python;Editor;microbit;micro:bit;
- StartupWMClass=mu
- MimeType=text/x-python3;text/x-python3;
- EOF
- cp usr/share/applications/mu.codewith.editor.desktop .
- usr/bin/pip3 freeze | grep "mu-editor" | cut -d "=" -f 3 >> ../VERSION
上面示例是 Atom 这个代码编辑器官网仓库中给出的 yml 配置文件。
app: Atom
ingredients:
script:
- DLD=$(wget -q "https://api.github.com/repos/atom/atom/releases/latest" -O - | grep -E "https.*atom-amd64.tar.gz" | cut -d'"' -f4)
- wget -c $DLD
- echo $DLD | cut -d/ -f8 > VERSION
- tar zxvf atom*tar.gz
script:
- cp -r ../atom-*/* usr/bin/
- find . -name atom.png -exec cp {} atom.png ;
- cat > atom.desktop <<EOF
- [Desktop Entry]
- Type=Application
- Name=Atom
- Icon=atom
- Exec=atom %u
- Categories=Development;IDE;
- Comment=The hackable text editor
- EOF
linuxdeployqt 工具应用
linuxdeployqt 是 Linux 下的 qt 打包工具!
工具装置
# 下载 linuxdeployqt 工具
$ wget "https://github.com/probonopd/linuxdeployqt/releases/download/7/linuxdeployqt-7-x86_64.AppImage"
# 重命名 linuxdeployqt 名称
$ mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
# 变成零碎可执行文件
$ sudo mv ./linuxdeployqt /usr/local/bin
$ sudo chmod 755 linuxdeployqt
# 查看 linuxdeployqt 版本
$ sudo linuxdelpoyqt --version
linuxdeployqt 4 (commit 988d294), build 481 built on 2018-02-02 15:05:23 UTC
# linuxdeployqt 命令要用到 -appImage 选项
$ wget -c "https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage" -O /usr/local/bin/appimagetool
# 变成零碎可执行文件
$ sudo chmod a+x /usr/local/bin/appimagetool
打包程序
# 不能定会胜利
$ linuxdeployqt < 本人的工程名称 > -appimage
官网文章中的示例演示
打包软件程序的简略演示流程 – cmake
生成 AppDir 打包目录
# fetch sources (you could as well use a tarball etc.)
> git clone https://github.com/linuxdeploy/QtQuickApp.git
> cd QtQuickApp
# build out of source
> mkdir build
> cd build
# configure build system
# the flags below are the bare minimum that is needed, the app might define additional variables that might have to be set
> cmake .. -DCMAKE_INSTALL_PREFIX=/usr
# build the application on all CPU cores
> make -j$(nproc)
# now "install" resources into future AppDir
> make install DESTDIR=AppDir
AppDir
└── AppRun
└── your_app.desktop
└── your_app.png
└── usr
├── bin
│ └── your_app
├── lib
└── share
├── applications
│ └── your_app.desktop
└── icons
└── <theme>
└── <resolution>
└── your_app.png
应用 linuxdeploy 打包成 AppImages
# get linuxdeploy's AppImage
> wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
> chmod +x linuxdeploy-x86_64.AppImage
# run linuxdeploy and generate an AppDir
> ./linuxdeploy-x86_64.AppImage --appdir AppDir
官网的 cmake 工具打包示例
#! /bin/bash
set -x
set -e
# building in temporary directory to keep system clean
# use RAM disk if possible (as in: not building on CI system like Travis, and RAM disk is available)
if ["$CI" == ""] && [-d /dev/shm]; then
TEMP_BASE=/dev/shm
else
TEMP_BASE=/tmp
fi
BUILD_DIR=$(mktemp -d -p "$TEMP_BASE" appimage-build-XXXXXX)
# make sure to clean up build dir, even if errors occur
cleanup () {if [ -d "$BUILD_DIR"]; then
rm -rf "$BUILD_DIR"
fi
}
trap cleanup EXIT
# store repo root as variable
REPO_ROOT=$(readlink -f $(dirname $(dirname $0)))
OLD_CWD=$(readlink -f .)
# switch to build dir
pushd "$BUILD_DIR"
# configure build files with CMake
# we need to explicitly set the install prefix, as CMake's default is /usr/local for some reason...
cmake "$REPO_ROOT" -DCMAKE_INSTALL_PREFIX=/usr
# build project and install files into AppDir
make -j$(nproc)
make install DESTDIR=AppDir
# now, build AppImage using linuxdeploy and linuxdeploy-plugin-qt
# download linuxdeploy and its Qt plugin
wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
# make them executable
chmod +x linuxdeploy*.AppImage
# make sure Qt plugin finds QML sources so it can deploy the imported files
export QML_SOURCES_PATHS="$REPO_ROOT"/src
# initialize AppDir, bundle shared libraries for QtQuickApp, use Qt plugin to bundle additional resources, and build AppImage, all in one single command
./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin qt --output appimage
# move built AppImage back into original CWD
mv QtQuickApp*.AppImage "$OLD_CWD"
作者: Escape
链接: https://www.escapelife.site/p…