โมเดลการกระจายแอปพลิเคชัน Flatpak ช่วยให้นักพัฒนาสามารถเป้าหมาย Linux ได้ด้วยวิธีใหม่และง่าย และช่วยให้ผู้ใช้ Linux ติดตั้งแอปพลิเคชันมากขึ้นโดยไม่ต้องกังวลเกี่ยวกับว่าพวกเขาใช้ Linux version อะไร นี่เป็นเทคโนโลยีที่น่าตื่นเต้น และบนระบบ Fedora Silverblue ของผม มันคือวิธีติดตั้งแพ็กเกจเริ่มต้น แอปพลิเคชันเดสก์ท็อปทั้งหมดของผมบน Silverblue และหลายตัวที่ผมชอบบน Slackware ทำงานเป็น Flatpak
มีสิ่งหนึ่งที่ทำให้ Flatpak ค่อนข้าง clumsy ในบางกรณี และนั่นคือ命名 scheme ของมัน ตัวอย่างเช่น เมื่อผมติดตั้ง Emacs เป็น Flatpak มันจะถูกลงทะเบียนบนระบบของผมเป็น org.gnu.emacs สิ่งนี้ทำไว้ เพื่อป้องกันการทับซ้อนชื่อของแอปพลิเคชันระดับระบบที่มีอยู่ – หากผมมี Emacs ติดตั้งอยู่แล้ว ความแตกต่างระหว่าง /usr/bin/emacs และการติดตั้ง Flatpak ของ Emacs คืออะไร? เพื่อเหตุผลนี้ Flatpak เช่น Emacs จะถูกติดตั้งไปที่อย่างเช่น (เตรียมพร้อม) เส้นทางนี้:
/var/lib/flatpak/app/org.gnu.emacs/current/active/export/bin/org.gnu.emacs
มันไม่ได้ symlink จาก /usr/bin หรือ /opt ตำแหน่งไม่ได้ถูกเพิ่มเข้าไปใน path ของผู้ใช้ และการ launch Flatpak ต้องใช้การเรียกแบบนี้:
$ flatpak run org.gnu.emacs
นั่นคือการพิมพ์เยอะมาก เทียบกับแค่พิมพ์ emacs
ชื่อยากที่จะจำ
命名 scheme ของ Flatpak ยังสมมติว่าคุณใช้ Flatpak บ่อยพอที่จะจำชื่อ reverse DNS ของแพ็กเกจ นอกจากโครงสร้างแล้ว ไม่มีมาตรฐานสำหรับการตั้งชื่อ Flatpak ดังนั้น Flatpak หนึ่งอาจใช้ camel-case เช่น org.libreoffice.LibreOffice ในขณะที่อีกตัวอาจใช้ mixed case เช่น org.gimp.GIMP
บางชื่อง่ายต่อการจดจำกว่าอื่นๆ ตัวอย่างเช่น org.glimpse_editor.Glimpse จำง่าย ก็ต่อเมื่อ คุณจำได้ว่าเว็บไซต์คือ https://glimpse-editor.org แทนที่จะเป็น glimpse.org และ underscore แทน dash
จากมุมมองของนักพัฒนา Flatpak นี่ไม่ใช่ปัญหา เพราะ Flatpak ถูกตั้งใจให้ launch จากเดสก์ท็อป คุณไม่ต้องจำ org.gnu.emacs เพราะคุณสามารถ launch จาก GNOME Activities หรือ K-Menu หรือ graphical launcher อื่นๆ ได้เสมอ
สิ่งนี้เป็นจริงบ่อยพอ แต่บางครั้งสะดวกกว่าที่จะ launch แอปพลิเคชันจากเทอร์มินัล เพราะคุณกำลังใช้เทอร์มินัลอยู่แล้ว ไม่ว่าผมจะอยากได้รูปภาพใน Glimpse หรือไฟล์ข้อความใน Emacs หรือไฟล์เพลงใน VLC ผมบ่อยครั้งยุ่งเกินไปในเทอร์มินัลจนไม่ได้ "drop" ออกไปที่เดสก์ท็อป (แม้แค่หนึ่งปุ่ม!) launch แอปพลิเคชัน คลิกผ่านเมนูเพื่อเปิดไฟล์ และคลิกผ่านระบบไฟล์เพื่อหาไฟล์ที่อยากเปิด
มันแค่เร็วกว่าที่จะพิมพ์คำสั่งตามด้วยไฟล์ที่อยากเปิด แต่ถ้าผมต้องพิมพ์ flatpak run org.something.app มันก็ไม่เร็ว
การใช้ Bash aliases เพื่อ launch Flatpak
วิธีแก้ปัญหาที่ชัดเจนที่สุดสำหรับทั้งหมดนี้คือ Bash alias ด้วย Bash alias คุณสามารถกำหนดคำสั่ง tùy ý ให้กับคำใดๆ ที่คุณต้องการ มี Bash aliases ทั่วไปมากมาย ที่เกือบผู้ใช้ Linux ทุกคนมีบนระบบ ไม่ว่าจะโดยเจตนาหรือเพราะ distribution ตั้งค่าไว้ล่วงหน้า:
$ grep alias ~/.bashrc alias cp='cp -v' alias rm='/usr/bin/local/trashy' alias mv='mv -v' alias ls='ls --color' alias ll='ls -l --color' alias lh='ll -h'
คุณสามารถสร้าง aliases สำหรับ Flatpak ได้เช่นกัน:
alias emacs='flatpak run org.gnu.emacs'
ปัญหาแก้แล้ว!
การโต้ตอบที่ดีขึ้นกับ Bash scripting
ไม่ได้ใช้เวลานานสำหรับกระบวนการเพิ่ม aliases ด้วยตนเองจะรู้สึกยุ่งยากเกินไปสำหรับผม และสำหรับผม ไม่ใช่งานแต่เป็นกระบวนการ การเปิด editor และเพิ่ม alias นั้นรวดเร็วมาก แต่เป็นการหยุดชะงักใน workflow ของผม
สิ่งที่ผมอยากได้จริงๆ คือบางอย่างที่ผมสามารถ ทางจิตใจและกายภาพ เพิ่มเข้าไปในกระบวนการติดตั้ง Flatpak เริ่มต้น ตามที่ต้องการ ไม่ใช่ Flatpak ทุกตัวที่ผมติดตั้งต้องการ alias ตัวอย่างเช่น นี่คือรายการบางส่วนของ Flatpak บนระบบ Silverblue ของผม:
$ find /var/lib/flatpak/app/* -maxdepth 0 -type d | tail -n5 /var/lib/flatpak/app/org.gnome.baobab /var/lib/flatpak/app/org.gnome.Calculator /var/lib/flatpak/app/org.gnome.Calendar /var/lib/flatpak/app/org.gnome.Characters /var/lib/flatpak/app/org.gnome.clocks /var/lib/flatpak/app/org.gnome.Contacts /var/lib/flatpak/app/org.gnome.eog /var/lib/flatpak/app/org.gnome.Evince /var/lib/flatpak/app/org.gnome.FileRoller /var/lib/flatpak/app/org.gnome.font-viewer /var/lib/flatpak/app/org.gnome.gedit /var/lib/flatpak/app/org.gnome.Logs /var/lib/flatpak/app/org.gnome.Maps /var/lib/flatpak/app/org.gnome.NautilusPreviewer /var/lib/flatpak/app/org.gnome.Rhythmbox3 /var/lib/flatpak/app/org.gnome.Screenshot /var/lib/flatpak/app/org.gnome.Weather /var/lib/flatpak/app/org.gnu.emacs /var/lib/flatpak/app/org.signal.Signal
ผมจะไม่ launch Weather หรือ GNOME Calculator จากเทอร์มินัลเลย ผมจะไม่ launch Signal จากเทอร์มินัลเช่นกัน เพราะมันเป็นแอปที่ผมเปิดตอนต้นวันและไม่ปิดเลย
ดังนั้น ข้อกำหนดที่ผมกำหนดให้ตัวเองคือ:
- เพิ่ม alias ตามที่ต้องการ (as-needed)
- ควบคุมจากเทอร์มินัล เพื่อให้เข้ากับท้ายกระบวนการติดตั้ง Flatpak ได้สบาย
- ทำหนึ่งอย่างและทำดี (does one thing and does it well)
- พกพาได้ (Portable) ข้าม Fedora, RHEL, Slackware และ distro อื่นๆ ที่ผมอาจใช้ในสัปดาห์ใดสัปดาห์หนึ่ง
โซลูชันที่ผมเลือกใช้ gầnนี้คือ สคริปต์ Bash เล็กๆ ที่กำหนดเอง ซึ่งผมใช้เพื่อเพิ่ม aliases สำหรับ Flatpak ที่ผมรู้ว่าผมอยากเข้าถึงเร็วจากเทอร์มินัล นี่คือสคริปต์:
#!/bin/sh
# GPLv3 appears here
# gnu.org/licenses/gpl-3.0.md
# vars
SYMRC=.bashrc.d
SYMDIR=$HOME/$SYMRC
SYMFILE=flatpak_aliases
# exit on errors
set -e
# this is where the aliases lives
if [ ! -d $SYMDIR ]; then
mkdir "${SYMDIR}"
touch "${SYMDIR}"/"${SYMFILE}"
fi
sourcer() {
echo 'Run this command to update your shell:'
echo ". ${SYMDIR}/${SYMFILE}"
}
lister() {
cat "${SYMDIR}"/"${SYMFILE}"
}
adder() {
grep "alias ${ARG}=" "${SYMDIR}"/"${SYMFILE}" && i=1
[[ $VERBOSE ]] && echo "$i"
if [ $i -gt 0 ]; then
echo "Alias for ${ARG} already exists:"
grep "alias ${ARG}=" "${SYMDIR}"/"${SYMFILE}"
exit
else
echo "alias ${ARG}='${COMMAND}'" >> "${SYMDIR}"/"${SYMFILE}"
[[ $VERBOSE ]] && echo "Alias for ${ARG} added"
sourcer
fi
unset i
}
remover() {
echo "Removing stuff."
sed -i "/alias ${ARG}=/d" "${SYMDIR}"/"${SYMFILE}"
sourcer
}
# arg parse
while [ True ]; do
if [ "$1" = "--help" -o "$1" = "-h" ]; then
echo " "
echo "$0 add --command 'flatpak run org.gnu.emacs' emacs # create symlink for emacs"
echo "$0 add --command 'flatpak run org.gnu.emacs -fs' emacs-fs # create symlink for emacs in fullscreen"
echo "$0 remove emacs # remove emacs symlink"
echo "$0 list # list all active flatpak symlinks"
echo " "
exit
elif [ "$1" = "--verbose" -o "$1" = "-v" ]; then
VERBOSE=1
shift 1
elif [ "$1" = "list" ]; then
MODE="list"
shift 1
elif [ "$1" = "add" ]; then
MODE="add"
shift 1
elif [ "$1" = "remove" ]; then
MODE="remove"
shift 1
elif [ "$1" = "--command" -o "$1" = "-c" ]; then
COMMAND="${2}"
shift 2
else
break
fi
done
#create array, retain spaces
ARG=( "${@}" )
case $MODE in
add)
adder
;;
list)
lister
;;
remove)
remover
;;
*)
echo "You must specify an action <list|add|remove>"
exit 1
esac
การใช้สคริปต์
เมื่อผมติดตั้ง Flatpak ที่ผมคาดว่าจะอยาก launch จากเทอร์มินัล ผมจบกระบวนการด้วยสคริปต์นี้:
$ flatpak install org.gnu.emacs $ pakrat add -c 'flatpak run org.gnu.emacs' emacs Alias for emacs added. Run this command to update your shell: . ~/.bashrc.d/flatpak_aliases $ . ~/.bashrc.d/flatpak_aliases
หาก alias มีอยู่แล้ว จะถูกตรวจพบ และไม่สร้าง alias ใหม่
ผมสามารถลบ alias ได้ด้วย:
$ pakrat remove emacs
สิ่งนี้ไม่ลบ Flatpak และทำงานเฉพาะกับไฟล์ flatpak_aliases ที่แยกไว้
Flatpak aliases ทั้งหมดถูกเพิ่มไปที่ ~/.bashrc.d/flatpak_aliases ซึ่งคุณสามารถ source อัตโนมัติเมื่อ shell เริ่มต้น โดยวางโค้ดแบบนี้ลงใน .bashrc หรือ .bash_profile หรือ .profile ของคุณ:
if [ -d ~/.bashrc.d ]; then for rc in ~/.bashrc.d/*; do if [ -f "$rc" ]; then . "$rc" fi done fi unset rc
Flatpak launching made easy
Flatpak ผสานรวมกับเดสก์ท็อป Linux ได้ดีมาก และมีโครงสร้างพื้นฐานที่แข็งแกร่ง reproducible พวกมันสร้างได้ค่อนข้างง่าย และใช้งานสบายมาก ด้วยความพยายามเพิ่มเติมเล็กน้อย คุณสามารถนำพวกมันลงมาสู่เทอร์มินัล เพื่อให้คุณสามารถใช้งานได้ในทุกวิธีที่เหมาะกับคุณ น่าจะมีโปรเจกต์อื่นๆ ที่คล้ายกันหลายโปรเจกต์ และอาจมีบางโปรเจกต์ใน development ที่ advanced กว่าสคริปต์ Bash เรียบๆ นี้ แต่นี่ทำงานดีสำหรับผมจนถึงตอนนี้ ลองใช้ดู หรือแบ่งปันโซลูชันกำหนดเองของคุณในความคิดเห็น!