Molto tempo fa, una distribuzione Linux ha distribuito un sistema operativo insieme a tutti il software disponibile per esso. Non esisteva il concetto di software "di terze parti" perché tutto faceva parte della distribuzione. Le applicazioni non erano tanto installate quanto abilitate da un grande archivio di software che avevi su uno dei tanti floppy disk o, successivamente, sui CD che hai acquistato o scaricato.
Questo si è evoluto in qualcosa di ancora più conveniente quando Internet è diventato onnipresente ed è nato il concetto di quello che ora è "app store". Naturalmente, le distribuzioni Linux tendono a chiamarlo un repository software o semplicemente repo in breve, con alcune variazioni per il "branding", come Ubuntu Software Center o, con il tipico minimalismo di GNOME, semplicemente Software .
Questo modello funzionava bene quando il software open source era ancora una novità e il numero di applicazioni open source era un numero piuttosto che un teorico numero. Nel mondo odierno di GitLab, GitHub e Bitbucket (e molti molti altri), è difficile contare il numero di progetti open source, tanto meno impacchettarli in un repository. Nessuna distribuzione Linux oggi, nemmeno Debian e il suo formidabile gruppo di manutentori di pacchetti, può pretendere o sperare di avere un pacchetto per ogni progetto open source installabile.
Ovviamente, un pacchetto Linux non deve essere necessariamente in un repository per essere installabile. Qualsiasi programmatore può impacchettare il proprio software e distribuirlo dal proprio sito web. Tuttavia, poiché i repository sono visti come parte integrante di una distribuzione, non esiste un formato di packaging universale, il che significa che un programmatore deve decidere se rilasciare un .deb
o .rpm
, o uno script di build AUR, o un pacchetto Nix o Guix, o uno script Homebrew, o semplicemente un .tgz
per lo più generico archivio per /opt
. È travolgente per uno sviluppatore che vive e respira Linux ogni giorno, tanto meno per uno sviluppatore che cerca solo di fare il massimo sforzo per supportare un target gratuito e open source.
Perché Flatpak?
Il progetto Flatpak fornisce un formato di imballaggio universale insieme a un mezzo di distribuzione decentralizzato, oltre a portabilità e sandboxing.
- Universale Installa il sistema Flatpak e puoi eseguire Flatpak, indipendentemente dalla tua distribuzione. Nessun demone o systemd richiesto. Lo stesso Flatpak funziona su Fedora, Ubuntu, Mageia, Pop OS, Arch, Slackware e altro.
- Decentralizzato Gli sviluppatori possono creare e firmare i propri pacchetti e repository Flatpak. Non esiste un repository a cui presentare una petizione per ottenere un pacchetto incluso.
- Portabilità Se hai un Flatpak sul tuo sistema e vuoi consegnarlo a un amico in modo che possa eseguire la stessa applicazione, puoi esportare il Flatpak su una chiavetta USB.
- Sandbox I flatpak utilizzano un modello basato su container, che consente l'esistenza di più versioni di librerie e applicazioni su un unico sistema. Sì, puoi facilmente installare l'ultima versione di un'app per testarla mantenendo la vecchia versione su cui fai affidamento.
Costruzione di un flatpak
Per creare un Flatpak, devi prima installare Flatpak (il sottosistema che ti consente di utilizzare i pacchetti Flatpak) e l'applicazione per la creazione di Flatpak.
Su Fedora, CentOS, RHEL e simili:
$ sudo dnf install flatpak flatpak-builder
Su Debian, Ubuntu e simili:
$ sudo apt install flatpak flatpak-builder
È inoltre necessario installare gli strumenti di sviluppo necessari per creare l'applicazione che si sta impacchettando. Per la natura dello sviluppo dell'applicazione che stai impacchettando, potresti già avere un ambiente di sviluppo installato, quindi potresti non notare che questi componenti sono necessari, ma se dovessi iniziare a creare Flatpak con Jenkins o da contenitori interni, devi assicurarti che i tuoi strumenti di costruzione fanno parte della tua toolchain.
Per la prima build di esempio, questo articolo presuppone che la tua applicazione utilizzi GNU Autotools, ma Flatpak stesso supporta altri sistemi di build, come cmake
, cmake-ninja
, meson
, ant
, oltre a comandi personalizzati (un simple
build system, nella terminologia Flatpak, ma questo non implica in alcun modo che la build stessa sia effettivamente semplice).
Directory di progetto
A differenza della rigida infrastruttura di compilazione RPM, Flatpak non impone una struttura di directory di progetto. Preferisco creare directory di progetto basate sulla dist pacchetti di software, ma non c'è motivo tecnico per cui non puoi invece integrare il tuo processo di compilazione Flatpak con la tua directory di origine. È tecnicamente più facile costruire un Flatpak dalla tua dist pacchetto, tuttavia, ed è anche una demo più semplice, quindi questo è il modello utilizzato in questo articolo. Imposta una directory di progetto per GNU Hello, che funge da primo Flatpak:
$ mkdir hello_flatpak
$ mkdir src
Scarica la tua fonte distribuibile. Per questo esempio, il codice sorgente si trova in https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
.
$ cd hello_flatpak
$ wget https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
Manifest
Il terminale Linux
- I 7 migliori emulatori di terminale per Linux
- 10 strumenti da riga di comando per l'analisi dei dati in Linux
- Scarica ora:cheat sheet SSH
- Cheat sheet sui comandi avanzati di Linux
- Esercitazioni sulla riga di comando di Linux
Un Flatpak è definito da un manifest, che descrive come creare e installare l'applicazione che sta fornendo. Un manifest è atomico e riproducibile. Tuttavia, un Flatpak esiste in un contenitore "sandbox", quindi il manifest è basato su un ambiente per lo più vuoto con una chiamata alla directory principale /app
.
I primi due attributi sono l'ID dell'applicazione che stai impacchettando e il comando da essa fornito. L'ID dell'applicazione deve essere univoco per l'applicazione che stai impacchettando. Il modo canonico di formulare un ID univoco consiste nell'utilizzare un valore di tripletta costituito dall'entità responsabile del codice seguito dal nome dell'applicazione, ad esempio org.gnu.Hello
. Il comando fornito dall'applicazione è qualunque cosa digiti in un terminale per eseguire l'applicazione. Ciò non implica che l'applicazione debba essere eseguita da un terminale anziché da un .desktop
file nel menu Attività o Applicazioni.
In un file chiamato org.gnu.Hello.yaml
, inserisci questo testo:
id: org.gnu.Hello
command: hello
Un manifest può essere scritto in YAML o in JSON. Questo articolo utilizza YAML.
Successivamente, è necessario definire ogni "modulo" consegnato da questo pacchetto Flatpak. Puoi pensare a un modulo come a una dipendenza o a un componente. Per GNU Hello esiste un solo modulo:GNU Hello. Applicazioni più complesse potrebbero richiedere una libreria specifica o un'altra applicazione completamente.
modules:
- name: hello
buildsystem: autotools
no-autogen: true
sources:
- type: archive
path: src/hello-2.10.tar.gz
Il buildsystem
value identifica come Flatpak deve costruire il modulo. Ogni modulo può utilizzare il proprio sistema di build, quindi un Flatpak può avere diversi sistemi di build definiti.
Il no-autogen
value dice a Flatpak di non eseguire i comandi di configurazione per autotools
, che non sono necessari perché il codice sorgente di GNU Hello è il prodotto di make dist
. Se il codice che stai creando non è in una forma facilmente compilabile, potrebbe essere necessario installare autogen
e autoconf
per preparare il sorgente per autotools
. Questa opzione non si applica affatto ai progetti che non utilizzano autotools
.
Il type
value indica a Flatpak che il codice sorgente si trova in un archivio, il che attiva le attività di rimozione dell'archivio necessarie prima della creazione. Il path
punta al codice sorgente. In questo esempio, il sorgente esiste in src
directory sulla tua macchina di compilazione locale, ma potresti invece definire l'origine come una posizione remota:
modules:
- name: hello
buildsystem: autotools
no-autogen: true
sources:
- type: archive
url: https://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
Infine, è necessario definire la piattaforma richiesta per l'esecuzione e la compilazione dell'applicazione. I manutentori di Flatpak forniscono runtime e SDK che includono librerie comuni, tra cui freedesktop
, gnome
e kde
. Il requisito di base è il freedesk
runtime e SDK, sebbene questo possa essere sostituito da GNOME o KDE, a seconda di ciò che il tuo codice deve eseguire. Per questo esempio di GNU Hello, sono richieste solo le basi.
runtime: org.freedesktop.Platform
runtime-version: '18.08'
sdk: org.freedesktop.Sdk
L'intero manifest flatpak di GNU Hello:
id: org.gnu.Hello
runtime: org.freedesktop.Platform
runtime-version: '18.08'
sdk: org.freedesktop.Sdk
command: hello
modules:
- name: hello
buildsystem: autotools
no-autogen: true
sources:
- type: archive
path: src/hello-2.10.tar.gz
Costruzione di un Flatpak
Ora che il pacchetto è definito, puoi compilarlo. Il processo di compilazione richiede a Flatpak-builder di analizzare il manifest e di risolvere ogni requisito:assicura che la piattaforma e l'SDK necessari siano disponibili (se non lo sono, dovrai installarli con il flatpak
comando), annulla l'archiviazione del codice sorgente ed esegue il buildsystem
specificato.
Il comando per iniziare:
$ flatpak-builder build-dir org.gnu.Hello.yaml
La directory build-dir
viene creato se non esiste già. Il nome build-dir
è arbitrario; potresti chiamarlo build
o bld
o penguin
e puoi avere più di una destinazione di compilazione nella stessa directory del progetto. Tuttavia, il termine build-dir
è un valore usato frequentemente nella documentazione, quindi usarlo come valore letterale può essere utile.
Test dell'applicazione
Puoi testare la tua applicazione prima o dopo che è stata compilata eseguendo il comando build insieme a --run
opzione e terminare il comando con il comando fornito dal Flatpak:
$ flatpak-builder --run build-dir \
org.gnu.Hello.yaml hello
Hello, world!
Imballaggio di app GUI con Flatpak
Preparare un semplice hello world autonomo l'applicazione è banale e fortunatamente il confezionamento di un'applicazione GUI non è molto più difficile. Le applicazioni più difficili da impacchettare sono quelle che non si basano su librerie e framework comuni (nel contesto del packaging, "comune" significa qualsiasi cosa non già confezionato da qualcun altro). La community Flatpak fornisce SDK ed estensioni SDK per molti componenti che altrimenti avresti dovuto impacchettare tu stesso. Ad esempio, quando si impacchetta l'implementazione Java pura di pdftk
, utilizzo l'estensione OpenJDK SDK che ho trovato nel repository Flatpak Github:
runtime: org.freedesktop.Platform
runtime-version: '18.08'
sdk: org.freedesktop.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.openjdk11
La comunità di Flatpak lavora molto sulle basi necessarie per l'esecuzione delle applicazioni al fine di semplificare il processo di confezionamento per gli sviluppatori. Ad esempio, il gioco Kblocks della comunità KDE richiede l'esecuzione della piattaforma KDE, che è già disponibile da Flatpak. I libkdegames
aggiuntivi la libreria non è inclusa, ma è altrettanto facile aggiungerla al tuo elenco di modules
come kblocks
stesso.
Ecco un manifest per il gioco Kblocks:
id: org.kde.kblocks
command: kblocks
modules:
- buildsystem: cmake-ninja
name: libkdegames
sources:
type: archive
path: src/libkdegames-19.08.2.tar.xz
- buildsystem: cmake-ninja
name: kblocks
sources:
type: archive
path: src/kblocks-19.08.2.tar.xz
runtime: org.kde.Platform
runtime-version: '5.13'
sdk: org.kde.Sdk
Come puoi vedere, il manifest è ancora diretto e relativamente intuitivo. Il sistema di compilazione è diverso e il runtime e l'SDK puntano a KDE invece che a Freedesktop, ma la struttura ei requisiti sono sostanzialmente gli stessi.
Poiché si tratta di un'applicazione GUI, tuttavia, sono necessarie alcune nuove opzioni. Innanzitutto, ha bisogno di un'icona in modo che quando è elencata nel menu Attività o Applicazione, appaia bella e riconoscibile. Kblocks include un'icona nei suoi sorgenti, ma i nomi dei file esportati da un Flatpak devono essere preceduti dall'ID dell'applicazione (come org.kde.Kblocks.desktop
). Il modo più semplice per farlo è rinominare il file direttamente nel sorgente dell'applicazione, cosa che Flatpak può fare per te fintanto che includi questa direttiva nel tuo manifest:
rename-icon: kblocks
Un'altra caratteristica unica delle applicazioni GUI è che spesso richiedono l'integrazione con servizi desktop comuni, come lo stesso server grafico (X11 o Wayland), un server audio come Pulse Audio e il sottosistema IPC (Inter-Process Communication).
Nel caso di Kblock, i requisiti sono:
finish-args:
- --share=ipc
- --socket=x11
- --socket=wayland
- --socket=pulseaudio
- --device=dri
- --filesystem=xdg-config/kdeglobals:ro
Ecco il manifest finale e completo, utilizzando gli URL per le fonti in modo da poterlo provare facilmente sul tuo sistema:
command: kblocks
finish-args:
- --share=ipc
- --socket=x11
- --socket=wayland
- --socket=pulseaudio
- --device=dri
- --filesystem=xdg-config/kdeglobals:ro
id: org.kde.kblocks
modules:
- buildsystem: cmake-ninja
name: libkdegames
sources:
- sha256: 83456cec44502a1f79c0be00c983090e32fd8aea5fec1461fbfbd37b5f8866ac
type: archive
url: https://download.kde.org/stable/applications/19.08.2/src/libkdegames-19.08.2.tar.xz
- buildsystem: cmake-ninja
name: kblocks
sources:
- sha256: 8b52c949e2d446a4ccf81b09818fc90234f2f55d8722c385491ee67e1f2abf93
type: archive
url: https://download.kde.org/stable/applications/19.08.2/src/kblocks-19.08.2.tar.xz
rename-icon: kblocks
runtime: org.kde.Platform
runtime-version: '5.13'
sdk: org.kde.Sdk
Per creare l'applicazione, devi avere installato KDE Platform e SDK Flatpak (versione 5.13 al momento della stesura di questo articolo). Una volta che l'applicazione è stata creata, puoi eseguirla usando il --run
metodo, ma per vedere l'icona dell'applicazione, devi installarla.
Distribuzione e installazione di un Flatpak che hai creato
La distribuzione dei flatpak avviene tramite i repository.
Puoi elencare le tue app su Flathub.org, un sito web della community inteso come tecnicamente posizione decentralizzata (ma centrale nello spirito) per Flatpaks. Per inviare il tuo Flatpak, inserisci il tuo manifest in un repository Git e invia una richiesta pull su Github.
In alternativa, puoi creare il tuo repository usando flatpak build-export
comando.
Puoi anche installare solo localmente:
$ flatpak-builder --force-clean --install build-dir org.kde.Kblocks.yaml
Una volta installato, apri il menu Attività o Applicazioni e cerca Kblocks.
Ulteriori informazioni
Il sito di documentazione di Flatpak offre una buona guida alla creazione del tuo primo Flatpak. Vale la pena leggere anche se hai seguito questo articolo. Oltre a ciò, i documenti forniscono dettagli su quali piattaforme e SDK sono disponibili.
Per coloro che amano imparare dagli esempi, ci sono manifest per ogni applicazione disponibile su Flathub.
Le risorse per creare e utilizzare Flatpak sono abbondanti e Flatpak, insieme ai container e alle app sandbox, sono probabilmente il futuro, quindi acquisisci familiarità con loro, inizia a integrarli con le tue pipeline Jenkins e goditi la creazione di pacchetti di app Linux semplici e universali.