GNU/Linux >> Linux Esercitazione >  >> Linux

Come costruire un Flatpak

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.


Linux
  1. Come creare pacchetti rpm

  2. Come installare Go su CentOS 8

  3. Come installare e utilizzare Flatpak in Linux

  4. Come gestire graficamente le autorizzazioni Flatpak utilizzando Flatseal

  5. Come copiare i file dal dockerfile all'host?

Come installare Flatpak su Debian 11

Come costruire il kernel Linux da zero

Come installare Flatpak su Ubuntu 20.04 LTS

Come installare Flatpak su Linux Mint 20

Come installare lo strumento di automazione della build Gradle su CentOS 8

Come creare facilmente la tua distribuzione Linux?