Sometimes I write things, sometimes I don't.

To content | To menu | To search

Réalisation du paquet Debian pour notre application

Lors du billet précédent, nous avons réalisé un générateur de mot de passe en Java avec une interface GTK+. Maintenant, nous allons enfermer tout ça dans un joli paquet Debian afin de diffuser et d’installer plus facilement notre application. Nous allons aussi en profiter de l’installation du paquet pour créer une entrée dans le menu GNOME, ce qui est toujours utile et plus sympa à voir.

Tout d’abord, nous allons commencer par modifier un peu notre programme. En effet, une fois installé, le chemin du dossier data ne sera pas le même que nous utilisions auparavant. Pour cela, on va faire simple. On va commencer par modifier le script shell permettant de lancer le programme. On commence par enlever son extension .sh qui ne sert pas à grand chose et qui va faire tâche une fois que ce script va se retrouver avec tous les autres déjà présents. Enfin on change les 2 premières lignes non commentées par celles-ci.
CLASSPATH=${CLASSPATH}:/usr/share/password-generator/data/gtk-4.0.jar
CLASSPATH=${CLASSPATH}:/usr/share/password-generator/passgenerator.jar


Maintenant, au tour des chemins qui se trouvent dans le code Java. Pour les modifier, on va créer une variable globale contenant le chemin, il ne restera ainsi qu’à concaténer le nom d’un fichier en cas de besoin. On ouvre alors le fichier PasswordGenerator.java. On ajoute tout de suite après la première accolade ceci.
public static final String DATA_PATH = "/usr/share/password-generator/data/";

On enregistre, puis on ouvre le fichier GtkInterface.java. On ajoute l’import suivant.
import static generator.PasswordGenerator.DATA_PATH;

On change la valeur du champ GLADE_FILE par celle-ci DATA_PATH + "PasswordGenerator.glade". Puis on cherche la ligne :
icon = new Pixbuf("./data/lock-logo.png");
Pour la remplacer par celle la.
icon = new Pixbuf(DATA_PATH + "lock-logo.png");

Il ne reste alors qu’à enregistrer.

Il faut maintenant compiler notre application. Pour ceci, on utilise le script Ant. Il faut donc que Ant soit installé (voir ce billet si ce n’est pas le cas). On se rend dans le dossier contenant le projet et on compile.
~$ cd workspace/PasswordGenerator
~/workspace/PasswordGenerator$ ant clean dist


On trouve alors un fichier passgenerator.zip dans le dossier build créé. On le récupère et le met dans notre répertoire perso. On en extrait tous les fichiers.
~$ unzip passgenerator.zip

Pour former un paquet Debian, il faut que l’on respecte une arborescence entre dossiers et sous-dossiers bien précise. Toujours dans le répertoire personnel, on crée le dossier password-generator.
~$ mkdir password-generator

Ce dossier doit contenir 2 sous-dossiers nommés respectivement DEBIAN et usr.
Commençons par nous intéresser au dossier DEBIAN et à son contenu. Il faut tout d’abord le créer et l’utiliser.
~$ mkdir password-generator/DEBIAN && cd password-generator/DEBIAN

A l’intérieur on va y déposer 3 fichiers : control, postinst et postrm.
Le fichier control permet de décrire le paquet : dépendances, description, nom, auteur et mainteneur du paquet… Voici son contenu pour nous.
Package: PasswordGenerator
Version: 1.0
Section: base
Priority: optional
Architecture: all
Depends: bash, sun-java6-jre
Maintainer: Guillaume Mazoyer <respawneral@gmail.com>
Description: Password generator written in Java and using GTK+.


Vous pouvez changer le nom du mainteneur du paquet, je ne vous en voudrais pas ^^. On remarque comme dépendances bash et sun-java6-jre (pour la JVM). On comprend vite comment ce fichier est utilisé une fois que l’on tente d’installer le paquet avec Gdebi.
Pour ce qui est de postinst et postrm, ce sont en fait 2 scripts. postinst est le script lancé après installation du paquet et postrm est le script exécuté après suppression du paquet. On va les utiliser entre autre pour créer le lanceur dans le menu GNOME et le supprimer. Dans la même veine, il est possible de créer les fichiers preinst et prerm qui correspondent aux scripts lancés avant installation et avant suppression.

Le fichier postinst va contenir ceci.
#!/bin/bash
LAUNCHER="/usr/share/applications/passgenerator.desktop"
touch $LAUNCHER
echo "[Desktop Entry]" > $LAUNCHER
echo "Name=Password Generator" >> $LAUNCHER
echo "Name[fr]=Générateur de mot de passe" >> $LAUNCHER
echo "Comment=Generate your passwords" >> $LAUNCHER
echo "Comment[fr]=Générez vos mots de passe" >> $LAUNCHER
echo "TryExec=passgenerator" >> $LAUNCHER
echo "Exec=passgenerator" >> $LAUNCHER
echo "Icon=gnome-lockscreen" >> $LAUNCHER
echo "Terminal=false" >> $LAUNCHER
echo "Type=Application" >> $LAUNCHER
echo "Categories=Utility;" >> $LAUNCHER
echo "MimeType=text/plain;" >> $LAUNCHER
echo "Password Generator successfully installed."


Et postrm lui contiendra ce code.
#!/bin/bash
LAUNCHER="/usr/share/applications/passgenerator.desktop"
rm $LAUNCHER
echo "Password Generator successfully uninstalled"


On crée le launcher et on le supprime ni plus ni moins.
A ce moment précis, les informations du paquet ainsi que le comportement d’installation et de suppression sont définis.

Il ne reste plus qu’à organiser correctement le contenu du dossier usr. Ce dernier va contenir 2 sous-dossiers nommés respectivement bin et share. A l’intérieur de bin, on mettre le script shell de lancement de notre programme (passgenerator). Le répertoire share lui va contenir un sous-répertoire nommé password-generator dans lequel on trouvera un dossier doc (contenant la documentation à réaliser comme vous le souhaitez), le dossier data et notre fichier JAR (passgenerator.jar). Ainsi lors de l’installation de notre paquet, le contenu de usr/bin ira dans /usr/bin (du système) et celui de usr/share ira de la même façon dans /usr/share (du système. On doit obtenir une arborescence comme celle-ci.

On n’oublie pas de rendre exécutable les scripts.
~/password-generator$ chmod 755 DEBIAN/post*
~/password-generator$ chmod 755 usr/bin/passgenerator


Il ne nous reste plus qu’à “packager” ceci. Pour cela, on se place dans le répertoire personnel. Et on utilise dpkg-deb.
~/password-generator$ cd ~
~$ dpkg-deb --build password-generator


On obtient alors le fichier password-generator.deb. On peut l’installer grâce à Gdebi ou encore avec la commande suivante.
~$ sudo dpkg -i password-generator.deb

Comments

1. On Saturday 15 November 2008, 22:04 by tshirtman

Autant j’avais suivis d’un œil distrait les billets sur le java, (chacuns ses gouts :P) autant ce billet m’a mis en face de la simplicité de création d’un paquet debian, la dernière fois que j’avais regardé j’avais été franchement découragé, mais la en te lisant je ne vois franchement pas par quoi (sans doutes n’avais-je pas compris que nombre de fichiers sont optionels). je viens de me créer un mini paquet avec un script dedans, et ça fait pile ce qu’il faut, ce qui fait que la prochaine release de mon jeu (voir lien) auras un paquet deb, c’est une chose certaine ^^.

Donc Merci!

2. On Saturday 15 November 2008, 22:28 by Guillaume

@ tshirtman : J’étais dans le même cas que toi avec la création de paquet. Et puis hier j’ai décidé de prendre mon courage à deux mains et je me suis lancé. Finalement ce n’est pas très complexe. Il faut juste être un peu organisé et tout se passe bien. De rien ;-)

3. On Sunday 16 November 2008, 00:08 by miraks

Très bon article.
Ce serait génial si pour la suite tu pouvais décrire comment publier ce paquet sur PPA.
https://help.launchpad.net/Packagin…

Encore merci

4. On Sunday 16 November 2008, 01:28 by poof65

Merci de répandre la bonne parole ^^

Je vais garder cette url sous la main car la dernière fois que j’ai voulu m’informer sur la création de paquets je suis tombé sur un truc imbitable et j’ai été complètement largué.
Là au moins c’est simple et compréhensible par tous.
Merci Respawner.

5. On Sunday 16 November 2008, 11:08 by Loyl

Merci pour cet article. Je n’espérai pas le voir venir aussi tôt !

6. On Sunday 16 November 2008, 18:30 by Nico

Merci pour ce tuto ! J’ai pu empaqueter l’un de mes softs !

7. On Sunday 16 November 2008, 18:51 by Guillaume

@Loyl : Au départ, moi non plus, mais devant la facilité de la chose, je me suis très vite exécuté.

8. On Monday 17 November 2008, 06:47 by gpocentek

Désolé de casser la bonne humeur ambiante mais le paquet résultant est horrible (je ne vais pas commencer une liste des problèmes, ce serait vraiment trop long).
Construire un vrai paquet n’est pas si complexe, ça demande juste un peu de temps.

9. On Monday 17 November 2008, 09:40 by Loyl

@gpocentek: Tu pourrais déjà lister les plus gros problèmes. Ça pourrait nous aider.

10. On Monday 17 November 2008, 12:44 by Manu

c vrai que ca a l’air simple vu comme ca
par contre, est on obligé de créer le launcher via postinst? n’est il pas mieux de l’intégrer directement dans le paquet?
ou bien est ce pour l’exemple

11. On Monday 17 November 2008, 15:09 by Guillaume

@Manu : C’est pour l’exemple oui le mieux est de créer le launcher et de faire un dossier usr/share/applications.

@gpocentek : Tu peux être plus précis ? Ca aiderait tout le monde.

12. On Monday 17 November 2008, 18:35 by gpocentek

En vrac, et juste sur le .deb (je passe sur le fait qu’un paquet est en général produit à partir d’un paquet source) :
- La section ‘base’ n’est pas correcte, le paquet n’est pas vital au système
- Les dépendances ne sont certainement pas bonnes :
o bash est de base sur toutes les installations, pas besoin de l’avoir en dépendance
o il manque les dépendances glade et gtk
o est-ce que l’appli ne fonctionne qu’avec la machine java de sun ? Il y a d’autres alternatives à priori
- Pas de changelog
- Pas de copyright
- Générer le .desktop dans le postinst ça n’a pas de sens (comme ça a été dit plus haut), et surtout sans prendre en compte les différents appels aux postinst et postrm qui interviennent en utilisant dpkg
- /usr/share/applications/ n’existe pas forcément, le postinst peut échouer
- Pas vraiment de rapport avec le packaging mais utiliser ‘echo’ pour chaque ligne n’est pas ce que j’ai vu de plus beau en bash ;)

Si ça tente du monde on peut organiser une nouvelle session ‘packaging debian’ sur #u-classroom (cf http://u-classroom). Ce serait une bonne occasion pour nous de se remettre en selle après une longue période d’inactivité, et apparemment il y a du monde intéressé.