之前介紹了一些筆記軟體,其中 Joplin 深受筆者的喜愛。最近為了備戰鐵人賽,所以裝了一個 Kubuntu Desktop 環境來使用,也把 Joplin 載來用看看 Linux 版本有什麼不一樣。發現 Joplin 原來是使用 .AppImage
格式發布的,過去筆者較少使用帶桌面環境的 Linux 發行版,所以比較不熟悉這個格式。藉此機會研究了一下相關資訊,並整理成筆記,當作鐵人賽前的暖身。
AppImage 前身是 PortableLinuxApps 與 klik,主打可攜式軟體發布方法,也就是 Windows 裡常見的 "Portable" 概念。使用 AppImage 有幾個優點:
.AppImage
格式。包裝 AppImage 時,會將所有程式會用到的 Library 與 Dependency 壓縮成一個檔案,並在執行時透過 FUSE 掛載到系統裡面。
AppImage - Official Website | GitHub | Wikipedia
基本用法非常簡單直觀,以 Joplin 為例,到官方 GitHub 的 Release 頁面下載 .AppImage
格式的執行檔,然後加上執行權限就可以執行了:
# 下載 Joplin 執行檔
wget https://github.com/laurent22/joplin/releases/download/v2.11.11/Joplin-2.11.11.AppImage
# 檢查 Joplin 的 SHA-512
wget https://github.com/laurent22/joplin/releases/download/v2.11.11/Joplin-2.11.11.AppImage.sha512
echo "$(cat Joplin-2.11.11.AppImage.sha512) Joplin-2.11.11.AppImage" | sha512sum -c -
# 賦予 Joplin 執行權限並執行
chmod +x Joplin-2.11.11.AppImage
./Joplin-2.11.11.AppImage
若沒有將 Joplin 加入 Path 的話,每次都透過 CLI 執行 Joplin 其實不那麼方便。若我們要將 Joplin 建立到桌面當捷徑,可以考慮幫它寫一個 .desktop
的捷徑檔,其內容如下:
# ~/Desktop/joplin.desktop
[Desktop Entry]
Name=Joplin
Exec=/path/to/Joplin-2.11.11.AppImage
Icon=/path/to/joplinapp-desktop.png
Terminal=false
Type=Application
Categories=Office;Notes;
.desktop
也是個有趣的格式規範,待筆者研究的更詳細之後再來分享心得,先暫時能用就好。在這裡會遇到一個問題:一個桌面捷徑不能沒有美美的圖示,那我們要去哪裡把程式的圖示挖出來呢?我們可以輸入以下指令,將程式掛載起來:
$ ./Joplin-2.11.11.AppImage --appimage-mount
/tmp/.mount_JoplinbcSnpd
此時程式輸出了一個路徑,在這個路徑底下,所有該程式會用到的檔案都一覽無遺,可以到該路徑底下列出檔案列表:
$ ll
total 186M
-rwxr-xr-x root root 2.4K AppRun
...
-rwxr-xr-x root root 145M @joplinapp-desktop
-rw-r--r-- root root 229 @joplinapp-desktop.desktop
lrwxrwxrwx root root 61 @joplinapp-desktop.png -> usr/share/icons/hicolor/1024x1024/apps/@joplinapp-desktop.png
...
發現有個神秘的 Link 連向某個 .png
檔,看來這東西高機率就是我們要的圖示了。這時筆者自作聰明的將這個路徑加上 /
變成 /usr/share/.../@joplinapp-desktop.png
,結果發現根本沒這個檔案啊?
原來是因為在 /tmp/.mount_JoplinbcSnpd
底下也有個 usr
資料夾,沿著這個資料夾往下找才會找到正確的圖示檔位置如下:
/tmp/.mount_JoplinbcSnpd/usr/share/icons/hicolor/1024x1024/apps/@joplinapp-desktop.png
因為這個圖示路徑只有在掛載時才會出現,而且每次掛載的路徑都不一樣,因此我們將這個圖示複製到執行檔的旁邊,就能完成 .desktop
裡面 Icon
的設定。
至此,我們完成了一個有美美圖示的桌面捷徑,可以用來執行某個 AppImage 格式的執行檔。
接下來的挑戰是:我們可以把這個程式釘選到畫面下方的工具列嗎?
筆者嘗試執行 Joplin 後,直接在工具列上右鍵釘選正在執行的 Joplin,然後就心滿意足的去做自己的事情了。結果隔天重開電腦後發現:阿怎麼工具列上的 Joplin 點了會報錯勒?錯誤訊息如下:
The file or folder /tmp/.mount_JoplinYWh41R/@joplinapp-desktop does not exist.
很明顯的,就是因為每次 AppImage 掛載的路徑都不一樣造成的錯誤。如果我們要將 AppImage 釘選到工具列,可以參考以下流程:
.desktop
檔案複製到 ~/.local/share/applications
底下。kbuildsycoca5
使這個新的設定生效。這時打開主選單(按下 WinKey 會跳出來的 Application Launcher)搜尋 Joplin 就會發現他出現在我們的主選單裡面了,這時對主選單裡的 Joplin 按右鍵釘選就可以了~
透過 AppImage 官方 GitHub 上提供的工具,我們能夠輕鬆的將程式打包成 AppImage 格式。首先到 Release 頁面下載工具(該工具也是 AppImage 格式的執行檔 XD)並賦予執行權限。
首先,隨意寫個 C 語言程式並編譯,假設編譯完的執行檔檔名為 Hello
,我們在當前目錄下建立一個 AppDir
資料夾,然後把 Hello 放在 AppDir/usr/bin/
底下。
然後寫一個 AppDir/AppRun
的檔案,這個檔案實際上就是個 Shell Script,用來描述執行此程式的行為,例如:
#!/bin/bash
HERE="$(dirname "$(readlink -f "${0}")")"
exec "${HERE}/usr/bin/Hello"
接下來撰寫 AppDir/Hello.desktop
檔案:
[Desktop Entry]
Name=Hello
Exec=AppRun
Type=Application
Icon=Hello
Categories=Utility;
你可以在 AppDir 底下放一個 Hello.png
作為圖示檔,但是在撰寫 .desktop
時似乎不需要加上副檔名。
接下來透過 AppImage Tool 打包我們的程式:
./appimagetool-x86_64.AppImage AppDir
這時當前目錄底下就會長出一個 Hello-x86_64.AppImage
的檔案,嘗試執行這個檔案確認是否能順利運作,這樣就大功告成啦!
雖然這對一個本身就能跨平台的 C 語言程式而言,似乎有點多此一舉,但就當作是個可以幫 CLI Tool 加 Icon 的工具吧 ((?
在探索 AppImage 用法的過程中,筆者意外的發現許多收穫。在 Linux 系統(至少在 Kubuntu 上)對 AppImage 的整合性非常好。雖然與 apt
, snap
或直接從 .deb
檔案等其他安裝方式相比,AppImage 的設定過程略為複雜,需要更多的調整才會比較符合一般使用需求,然而 AppImage 依然是一個靈活且實用的軟體發布方法。