GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Création d'applications Linux à distribution croisée avec Flatpak

La fragmentation est un problème depuis un certain temps dans l'écosystème Linux. Une variété de distributions existent aujourd'hui, avec leurs propres gestionnaires de paquets et leurs propres notions de ce qu'est un « système de base ». C'est fastidieux pour les développeurs d'applications :après avoir créé des packages spécifiques à la distribution et maintenu les référentiels, ils doivent corriger les bogues spécifiques à la distribution qui peuvent survenir. De plus, contrairement aux plates-formes mobiles telles qu'iOS et Android, les applications Linux s'exécutent sans bac à sable avec accès à toutes les fonctionnalités du système de base.

Pour résoudre ces problèmes, une grande variété de solutions ont été proposées. Dans cet article, nous examinerons Flatpak :un moyen de distribuer des applications et de les exécuter dans un bac à sable restreint.

Qu'est-ce que Flatpack ?

Flatpak est une technologie de création, de distribution, d'installation et d'exécution d'applications, principalement destinée au bureau Linux. Il permet aux applications de regrouper les dépendances et d'être livrées avec des runtimes, de sorte que les applications ne finissent pas par dépendre des bizarreries d'une distribution particulière. De plus, il augmente la sécurité des applications Linux en les isolant dans des bacs à sable.

L'architecture d'une application Flatpak est présentée dans le schéma ci-dessous :

Chaque application Flatpak est soutenue par un "runtime", qui contient les dépendances de base utilisées par les applications. Ces runtimes sont partagés entre les applications. Plusieurs runtimes et même différentes versions du même runtime peuvent coexister sur un système en même temps. De cette façon, les applications disposent d'un système de base assez cohérent sur lequel s'appuyer.

Afin de créer des applications pour ce runtime, des runtimes spéciaux appelés SDK (Software Development Kits) sont fournis. Ils contiennent des outils tels que des compilateurs et des en-têtes de développement. Si votre application dépend de bibliothèques non intégrées dans le runtime, vous devez les compiler avec le SDK, avec votre application.

De plus, il existe des "extensions", qui sont des modules complémentaires facultatifs pour les runtimes et les applications. Ils sont le plus souvent utilisés pour séparer les informations de traduction et de débogage de l'environnement d'exécution ou de l'application d'origine.

L'un des objectifs de Flatpak est d'augmenter la sécurité des applications en les isolant les unes des autres. Par défaut, Flatpak fournit un accès très limité aux ressources du système hôte. Sauf demande explicite, les applications ne sont pas autorisées à utiliser le réseau, à accéder aux fichiers sur le système de base ou à communiquer avec des services tels que X, DBus ou Pulseaudio. De plus, les "portails" permettent un accès sélectif aux ressources via des API de haut niveau.

Installation, commandes Flatpak et conventions de dénomination

Flatpak est disponible dans les dépôts de la plupart des distributions. Sur Arch Linux et Fedora, vous devez installer le flatpak package pour installer le flatpak commande, qui vous aide à installer et à créer des applications.

sudo dnf install flatpak # Fedora
sudo pacman -S flatpak # Arch

Les utilisateurs d'Ubuntu ne l'ont pas dans les référentiels par défaut, donc l'installer est un peu plus compliqué. Tout d'abord, vous devez ajouter ce PPA à votre système :

sudo add-apt-repository ppa:alexlarsson/flatpak

Ensuite, vous pouvez installer le package avec :

sudo apt update
sudo apt install flatpak

Alors que le flatpak La commande peut certainement vous aider à créer des applications, ce n'est pas le moyen le plus pratique. Il existe un autre outil, nommé flatpak-builder , qui vous permet de créer des applications Flatpak à partir d'un fichier JSON. (Nous aborderons cet outil plus loin dans cet article.)  Vous pouvez installer cet outil avec :

sudo dnf install flatpak-builder # Fedora
sudo pacman -S flatpak-builder # Arch
sudo apt install flatpak-builder # Ubuntu

Désormais, pour installer des applications ou des runtimes, vous devez ajouter des référentiels à la liste des télécommandes de Flatpak. Ces télécommandes peuvent être hébergées dans un répertoire local ou en ligne. Les runtimes/applications sont identifiés à l'aide d'une adresse DNS inverse, comme com.booleanworld.foo . Dans certaines circonstances, vous devrez peut-être également spécifier l'architecture et la "branche" du runtime. Cela se fait à l'aide d'un triplet séparé par une barre oblique, comme com.booleanworld.foo/x86_64/1.3 .



Le flatpak La commande ajoute généralement des logiciels et des référentiels pour tous les utilisateurs. Cependant, cela ne convient pas pour essayer des choses, nous allons donc utiliser le --user flag pour limiter ces modifications à l'utilisateur actuel uniquement.

Maintenant que nous avons les bases en place, nous allons jeter un œil à la théorie sur la création d'applications Flatpak.

Structure de l'application Flatpack

Lorsque vous regroupez une application avec Flatpak, la structure de répertoires suivante est automatiquement créée :

  • metadata  :Ce fichier contient des informations sur le SDK et l'environnement d'exécution sur lequel l'application s'exécutera, ainsi qu'une liste des ressources système de base auxquelles l'application doit accéder.
  • files :Ce répertoire contient les fichiers qui composent l'application, y compris toutes les données de l'application. Le bin le sous-répertoire à l'intérieur contient les exécutables de l'application.
  • export :Ce répertoire contient tous les fichiers auxquels le système de base doit accéder. Les exemples incluent les données AppStream, le .desktop fichier et l'icône de l'application. Tous les fichiers que vous placez ici doivent être précédés de l'identifiant. Par exemple, un fichier de bureau peut avoir le nom com.booleanworld.foo.desktop .

Bien que vous puissiez construire cette structure à la main, ce n'est pas nécessaire. Flatpak dispose d'outils pour vous aider à créer automatiquement cette structure, et cela nécessite très peu de configuration si vous avez un projet typique basé sur les autotools. Avec les projets non basés sur des outils automatiques, vous devez généralement définir le répertoire "préfixe" sur /app pour que tout soit opérationnel.

Prérequis

Les sections suivantes de l'article contiennent quelques exemples de création d'applications Flatpak. Comme nous l'avons mentionné précédemment, les applications ont besoin d'un runtime pour s'exécuter et d'un SDK pour le processus de construction. Ainsi, la première étape consiste à ajouter un référentiel à partir duquel ils sont disponibles. Nous ajouterons le référentiel disponible sur sdk.gnome.org pour notre usage.

flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo --user

Pour créer les exemples ci-dessous, nous avons besoin de deux environnements d'exécution : org.freedesktop.Platform et org.gnome.Platform , et deux SDK : org.freedesktop.Sdk et org.gnome.Sdk . Ici, nous avons utilisé les versions 1.6 et 3.24 du runtime/SDK Freedesktop et Gnome.

flatpak install --user gnome org.freedesktop.Platform/x86_64/1.6
                             org.freedesktop.Sdk/x86_64/1.6
                             org.gnome.Plaform/x86_64/3.24
                             org.gnome.Sdk/x86_64/3.24

Ensuite, consultez le référentiel flatpak-resources, qui contient toutes les ressources nécessaires pour suivre cet article.

git clone https://github.com/boolean-world/flatpak-resources
cd flatpak-resources

Nous examinerons deux exemples de création d'applications dans les sections suivantes.

Construire un "chaton", un "chat" léger

Dans cette section, nous allons apprendre à créer une application Flatpak de base. L'application est une petite version du cat commande, nommée kitten .

Tout d'abord, vous devez créer la structure de répertoires dont nous avons parlé précédemment. Le build-init commande peut le faire pour vous. Vous devez lui donner un répertoire de construction, le nom de votre application, ainsi que le SDK et le runtime à utiliser (dans cet ordre). Vous pouvez également ajouter un "nom de branche" facultatif, mais nous le laisserons de côté dans cet exemple.

flatpak build-init kitten-build com.booleanworld.kitten
                                org.freedesktop.Sdk
                                org.freedesktop.Platform

Comme nous l'avons mentionné précédemment, le répertoire de préfixes des applications Flatpak est /app , et vous devez créer le bin répertoire qu'il contient. Lorsque vous souhaitez exécuter une commande dans le répertoire de construction, utilisez le build commande :

flatpak build kitten-build mkdir -p /app/bin

L'étape suivante consiste à compiler kitten.c avec gcc :

flatpak build kitten-build gcc kitten.c -o /app/bin/kitten

Ensuite, vous pouvez terminer la construction avec build-finish . La commande sera kitten , et il doit accéder au système de fichiers de l'hôte (afin que vous puissiez voir n'importe quel fichier sur le système hôte). Ainsi, vous pouvez terminer la compilation avec ces paramètres définis :

flatpak build-finish kitten-build --filesystem=host --command=kitten

Maintenant, si vous voulez tester l'application, vous devez l'installer. La première étape consiste à exporter l'application dans un référentiel local. Dans notre exemple, le dossier du référentiel est my-repo :

flatpak build-export my-repo kitten-build

Ensuite, nous ajouterons le référentiel avec le nom test-repo . Puisque nous n'utilisons pas de signatures GPG, nous informerons Flatpak avec le --no-gpg-verify commutateur.



flatpak remote-add --user --no-gpg-verify test-repo my-repo

Enfin, vous pouvez l'installer avec :

flatpak install --user test-repo com.booleanworld.kitten

Maintenant, vous pouvez tester si cela fonctionne en l'exécutant comme suit :

flatpak run com.booleanworld.kitten ~/.bashrc

Si vous avez correctement suivi toutes les étapes jusqu'à présent, cela devrait afficher le contenu de votre .bashrc fichier :

Félicitations pour la création de votre première application Flatpak !

Les étapes ont été assez simples jusqu'à présent, mais le build-finish commandement justifie une discussion plus approfondie. C'est ce que nous allons faire dans la section suivante.

Un examen plus approfondi de la commande "build-finish"

L'un des principaux objectifs de Flatpak est de mettre les applications en bac à sable et de ne fournir qu'un accès minimal aux ressources du système hôte. Dans l'exemple précédent, nous avons autorisé l'application "chaton" à accéder à n'importe quel fichier du système avec build-finish . Les commutateurs que vous pouvez utiliser pour autoriser l'accès à diverses ressources sont répertoriés ci-dessous :

  • --filesystem={path}

Ce commutateur permet d'accéder à des chemins spécifiques sur le système. Vous pouvez fournir un chemin spécifique (par exemple, /usr/share ). home permet l'accès au répertoire personnel de l'utilisateur, et host permet d'accéder à tous les fichiers du système. De plus, vous pouvez également rendre un chemin en lecture seule avec :ro . Par exemple, --filesystem=/usr/share:ro --filesystem=home autorise l'accès en lecture seule à /usr/share et un accès en lecture-écriture au répertoire personnel de l'utilisateur.

  • --share={type}

Ce commutateur permet d'accéder à des ressources particulières. Les types les plus couramment utilisés sont ipc et network , qui permettent l'accès IPC et réseau. Dans la plupart des applications GUI, --share=ipc est utilisé pour que la mémoire partagée X fonctionne, ce qui améliore les performances.

  • --socket={type}

Ce commutateur vous permet d'utiliser des sockets particuliers. Les types de socket les plus couramment consultés sont x11 , wayland et pulseaudio . Les deux premiers sont utilisés par les applications pour restituer les éléments de l'interface graphique, et le dernier est utilisé pour lire l'audio via le démon Pulseaudio.

  • --device={device}

Cela permet aux applications d'accéder de manière sélective à certains appareils. Le plus souvent, dri est utilisé ici pour que les applications puissent utiliser le rendu OpenGL.

  • --talk-name={name} et --system-talk-name={name}

Ces commutateurs permettent aux applications de communiquer avec des services nommés via le bus de session et le bus système de DBus.

  • --env={varname}={value}

Le env switch vous permet d'exporter des variables d'environnement. {varname} est le nom de la variable, qui est défini sur le {value} donné .

Si une application nécessite l'accès à dconf, vous devez utiliser les commutateurs suivants :

--filesystem=xdg-run/dconf
--filesystem=~/.config/dconf:ro
--talk-name=ca.desrt.dconf
--env=DCONF_USER_CONFIG_DIR=.config/dconf

Nous verrons un exemple pratique impliquant ces commutateurs dans une section ultérieure.

Créer des applications automatiquement :flatpak-builder

Bien que les étapes impliquées dans la construction d'applications Flatpak soient assez simples, il est toujours fastidieux de les construire étape par étape. flatpak-builder est un outil qui vous permet de créer des applications de manière déclarative avec un manifeste JSON. Tant que le code source est agencé conformément à la "build API", le constructeur peut compiler et installer des applications à partir des archives source. La plupart des logiciels basés sur les outils automatiques sont déjà conformes à l'API, donc aucune autre configuration n'est généralement nécessaire.

Un fichier manifeste typique ressemble généralement à ceci :

{
  "app-id": "com.booleanworld.kitten",
  "runtime": "org.freedesktop.Platform",
  "runtime-version": "1.6",
  "sdk": "org.freedesktop.Sdk",
  "command": "kitten",
  "finish-args": [
     "--filesystem=host"
  ],
  "modules": [
    {
      "name": "kitten",
      "sources": [
        {
          "type": "archive",
          "url": "https://opensource.example.com/kitten-0.0.1.tar.gz",
          "sha256": "38ecfd39b76a2505376f5a57ebcc7b19d35efaf9f8c724a24382c45aa1378018"
        }
      ]
    }
  ]
}

Comme vous pouvez le voir, ce fichier contient les mêmes informations que nous avions spécifiées précédemment avec diverses commandes. De plus, il contient une liste de modules à construire. Dans l'exemple ci-dessus, il n'y a qu'un seul module. Si vous avez une application complexe qui dépend de plusieurs modules, vous devrez tous les lister. Par exemple, gnome-calculator dépend de mpc et mpfr, et le manifeste ressemble à ceci.

Différents types de sources sont pris en charge. Un autre type de source populaire est git , et vous devez fournir l'URL du référentiel et éventuellement, la branche qui doit être extraite.

Le manifeste est très puissant et prend en charge la définition de CFLAGS/CXXFLAGS, le renommage des fichiers pour l'exportation et la suppression des fichiers inutiles. Dans la section suivante, nous analyserons une application pratique et apprendrons comment la conditionner pour Flatpak.

Un exemple concret :le galculateur d'emballage

Dans cette section, nous allons prendre galculator, une application de calcul simple et la construire avec flatpak-builder . Nous devons effectuer une petite analyse pour savoir quels fichiers doivent être renommés ou supprimés. Ainsi, dans un premier temps, nous ferons une installation test. Ensuite, nous pouvons créer le manifeste si nécessaire.

Étant donné que galculator est une application GTK, nous utiliserons le runtime Gnome et le SDK. Vous devriez les installer maintenant si vous ne l'avez pas déjà fait. De plus, vous devez télécharger l'archive source à partir d'ici. (Nous avons utilisé la version 2.1.4, qui est la dernière version au moment de la rédaction de cet article.)

Rechercher les fichiers à exporter/supprimer

Une fois que vous avez téléchargé et extrait l'archive source, vous devez essayer de la construire à l'aide du SDK. Le SDK Gnome contient également des outils tels que bash, vous pouvez donc le démarrer en utilisant :

flatpak run --command=bash --filesystem=host --devel org.gnome.Sdk/x86_64/3.24

Maintenant, déplacez-vous dans le répertoire source du galculator et utilisez l'incantation habituelle pour le construire. Nous allons définir notre répertoire de préfixes sur ~/galculator-test .

./configure --prefix=$HOME/galculator-test
make install

Maintenant, vous pouvez explorer les fichiers dans le galculator-test annuaire. Comme vous pouvez probablement le constater, les fichiers suivants doivent être exportés :

  • Informations AppStream en share/appdata/galculator.appdata.xml
  • Icônes en share/icons
  • L'entrée de bureau en share/applications/galculator.desktop

Malheureusement, ils ne sont pas précédés du nom de l'application. Ainsi, vous devez les renommer avec les propriétés suivantes dans le manifeste :

{
	"rename-appdata-file": "galculator.appdata.xml",
	"rename-icon": "galculator",
	"rename-desktop-file": "galculator.desktop"
}

Une fois ces fichiers renommés, flatpak-builder les exportera automatiquement. Une fois le package Flatpak construit, cela aidera à créer des entrées de menu sur le système de base.

De plus, le share/man et share/pixmaps les répertoires ne sont pas nécessaires, vous pouvez donc les supprimer avec :

{
    "cleanup": [
        "/share/man",
        "/share/pixmaps"
    ]
}

Configuration du bac à sable

Comme il s'agit d'une application GTK, vous devez lui permettre d'accéder à X11 et Wayland, et de partager les mécanismes IPC. Vous devez également lui permettre d'utiliser le rendu OpenGL. De plus, galculator a besoin d'accéder à dconf, et vous devez ajouter les entrées dont nous avons parlé plus tôt. Les commutateurs, qui auraient été passés à build-finish sont répertoriés dans le finish-args propriété dans le manifeste :

{
    "finish-args": [
        "--share=ipc",
        "--socket=x11",
        "--socket=wayland",
        "--device=dri",
        "--filesystem=xdg-run/dconf",
        "--filesystem=~/.config/dconf:ro",
        "--talk-name=ca.desrt.dconf",
        "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
    ]
}

Remplir le manifeste

À ce stade, vous avez configuré la plupart des parties importantes du manifeste. Configurer le reste devrait être assez facile, et le manifeste final que nous avons utilisé est ici. Nous avons ajouté un ensemble de build-options , qui définit CFLAGS et CXXFLAGS sur -O3 .

Construire et tester l'application

Enfin, nous pouvons créer l'application. Exécutez simplement flatpak-builder avec un répertoire de construction et le manifeste. Dans cet exemple, galculator est le répertoire de construction et org.mnim.galculator.json est le fichier manifeste.

flatpak-builder galculator org.mnim.galculator.json

Ensuite, exportez-le dans le référentiel comme nous l'avons fait précédemment :

flatpak build-export my-repo galculator

Vous pouvez maintenant tester l'application en l'installant :

flatpak install --user test-repo org.mnim.galculator

L'application est immédiatement installée, et vous obtenez même des entrées de bureau comme une application normale ! Vous pouvez le lancer à partir de l'entrée de menu ou l'exécuter avec flatpak run comme nous l'avons fait plus tôt.

Distribuer des applications

Maintenant que vous avez créé une application, comment procédez-vous pour la distribuer ? Le moyen le plus simple consiste à transférer le répertoire du référentiel sur un serveur et à le diffuser sur le Web. Ensuite, vous pouvez demander aux utilisateurs d'ajouter votre référentiel à leur liste et d'installer des applications de cette façon.

De nombreuses personnes préfèrent installer un logiciel signé avec GPG, car cela prouve que l'application provient bien du mainteneur d'origine. Vous pouvez créer facilement des clés GPG avec le gpg2 commande :

gpg2 --quick-key-gen [email protected]

Assurez-vous de noter l'ID de clé car vous en aurez besoin plus tard. Dans notre exemple, nous supposerons que l'ID de clé est A318C188C20D410A .

Ensuite, vous pouvez créer un référentiel signé GPG lors de l'exécution de build-export comme ça :

flatpak build-export my-repo galculator --gpg-sign=A318C188C20D410A

Si vous avez un référentiel non signé existant, vous pouvez le signer comme suit :

flatpak build-sign my-repo --gpg-sign=A318C188C20D410A
flatpak build-update-repo my-repo --gpg-sign=A318C188C20D410A

Lorsque vous souhaitez publier le référentiel, assurez-vous de fournir aux utilisateurs une copie de la clé publique. Pour exporter votre clé publique, exécutez :

gpg2 --export A318C188C20D410A > public.gpg

Vous devez publier cette clé sur votre site Web. Lorsque vos utilisateurs souhaitent ajouter votre référentiel, ils doivent télécharger la clé publique. Si l'utilisateur a téléchargé une clé nommée public.gpg , ils peuvent maintenant ajouter le référentiel en exécutant :

flatpak remote-add --gpg-import=public.gpg test-repo https://software.example.com/repo/

Cependant, cette méthode est extrêmement peu pratique pour les utilisateurs. Heureusement, vous pouvez simplifier le processus en créant des fichiers flatpakref et flatpakrepo, qui sont décrits en détail dans la documentation.

Conclusion

Dans cet article, nous avons découvert Flatpak et comment vous pouvez distribuer des logiciels à l'aide de cette nouvelle technologie. Il est plus axé sur la sécurité et offre de meilleures capacités d'intégration et de mise à jour par rapport aux méthodes traditionnelles telles que AppImage.

Si vous souhaitez en savoir plus sur ce sujet, consultez la documentation pour les développeurs et le flatpak-manifest man page sont de bons endroits pour commencer. Si vous souhaitez lire des exemples plus complexes de fichiers manifestes/flatpakref, consultez le référentiel Gnome-apps et les exemples Flathub.


Ubuntu
  1. Installer des applications sur Linux avec Flatpak

  2. Installer Linux avec LVM

  3. Flatpak sur Linux :qu'est-ce que c'est et comment installer des applications avec ?

  4. Comment démarrer des applications de démarrage avec un délai sous Linux

  5. Pouvez-vous développer des applications Linux avec Xamarin ?

Commande de tri sous Linux avec des exemples

Commande IP Linux avec exemples

11 Commande Strace avec exemple sous Linux

w Commande expliquée avec des exemples sous Linux

Comment installer des applications Linux hors ligne avec Cube

Comment installer Flatpak sur Linux Mint 20