créer un paquet .deb à partir de scripts ou de fichiers binaires

73

J'ai cherché un moyen simple de créer des paquets .deb pour des choses qui n'ont pas de code source à compiler (configs, shellscripts, logiciels propriétaires). C'était un problème car la plupart des tutoriels de paquet supposent que vous avez une archive source que vous voulez compiler. Ensuite, j'ai trouvé ce court tutoriel (allemand).

Ensuite, j'ai créé un petit script pour créer un référentiel simple. Comme ça:

rm /export/my-repository/repository/*
cd /home/tdeutsch/deb-pkg
for i in $(ls | grep my); do dpkg -b ./$i /export/my-repository/repository/$i.deb; done
cd /export/avanon-repository/repository
gpg --armor --export "My Package Signing Key" > PublicKey
apt-ftparchive packages ./ | gzip > Packages.gz
apt-ftparchive packages ./ > Packages
apt-ftparchive release ./ > /tmp/Release.tmp; mv /tmp/Release.tmp Release
gpg --output Release.gpg -ba Release

J'ai ajouté la clé au trousseau d'apt et ai inclus la source comme ceci:

deb http://my.default.com/my-repository/ ./

Il semble que le référentiel lui-même fonctionne bien (j'ai rencontré quelques problèmes; pour les résoudre, j'ai dû ajouter les packages à deux reprises et créer la solution de contournement de fichier temporaire pour le fichier Release). J'ai également mis quelques fichiers .deb téléchargés dans le dépôt, il semble qu'ils fonctionnent aussi sans problèmes. Mais mes paquets créés par moi-même n’ont pas ... Quand je le fais sudo apt-get update, ils provoquent des erreurs comme celle-ci:

E: Problem parsing dependency Depends
E: Error occurred while processing my-printerconf (NewVersion2)
E: Problem with MergeList /var/lib/apt/lists/my.default.com_my-repository_._Packages
E: The package lists or status file could not be parsed or opened.

Quelqu'un at-il une idée de ce que j'ai mal fait?

UPDATE 2012-03-06: Juste un conseil pour une autre personne à la recherche d'un moyen facile de créer des DEB: jetez un coup d'œil à FPM .

Thomas Deutsch
la source
Avez-vous ajouté un fichier DEBIAN / control au package, qui contient le champ Dépend:?
Bilal Akhtar
5
Btw. J'utilise maintenant FPM pour mes besoins en matière d'emballage: github.com/jordansissel/fpm
Thomas Deutsch
FWIW, j'ai reçu le même message d'erreur sur un paquet que j'ai construit parce que j'avais mal spécifié l'une des dépendances. J'avais écrit "foo> = 2.1" alors qu'il devrait être "foo (> = 2.1)". J'ai passé plus d'une heure à examiner la dernière moitié de l'erreur avant de réaliser que la première moitié de l'erreur me disait exactement ce qui n'allait pas ... (PS: FPM, ça claque. Vous regardez aussi Aptly.)
Mark E. Haase
2
Je suis tout à fait d’accord pour dire qu’il n’existe pas de didacticiels ni de guides pour emballer quelque chose qui ne provient pas d’une archive tar contenant des fichiers make, etc. Il est très difficile de savoir comment le faire. Nous avons besoin d’un tel guide pour les développeurs, comme les développeurs Java, qui souhaitent distribuer une guerre avec quelques scripts et peut-être liquibase, mais ne sont pas des administrateurs Debian sys ou des responsables Debian. FPM ne vous aide pas dans ce cas, car il nécessite également que vous sachiez déjà comment créer quelque chose qu'il peut empaqueter.
John Little
1
Merci beaucoup d'avoir partagé l'information sur fpm. Cela fonctionne comme un charme!
Damian Nadales

Réponses:

70

Le tutoriel que vous avez lié utilise une approche de bas niveau pour la construction d'un package. Une telle approche n'est généralement pas recommandée et peut entraîner toutes sortes de problèmes si elle n'est pas effectuée avec soin.

La création d'un fichier .deb pour un script est très simple une fois que vous avez compris les bases du packaging. En un mot:

# Configure your paths and filenames
SOURCEBINPATH=~
SOURCEBIN=myscript.sh
DEBFOLDER=~/somescripts
DEBVERSION=0.1

DEBFOLDERNAME=$DEBFOLDER-$DEBVERSION

# Create your scripts source dir
mkdir $DEBFOLDERNAME

# Copy your script to the source dir
cp $SOURCEBINPATH/$SOURCEBIN $DEBFOLDERNAME 
cd $DEBFOLDERNAME

# Create the packaging skeleton (debian/*)
dh_make -s --indep --createorig 

# Remove make calls
grep -v makefile debian/rules > debian/rules.new 
mv debian/rules.new debian/rules 

# debian/install must contain the list of scripts to install 
# as well as the target directory
echo $SOURCEBIN usr/bin > debian/install 

# Remove the example files
rm debian/*.ex

# Build the package.
# You  will get a lot of warnings and ../somescripts_0.1-1_i386.deb
debuild

L'ajout de scripts nécessite leur copie dans le répertoire et leur ajout au fichier debian / install. Il suffit ensuite de réexécuter debuild. Vous devez également vérifier et mettre à jour les fichiers debian / * selon les besoins.

Vous devriez lire les pages de manuel pour: dh_make, dh_installetdebuild

João Pinto
la source
3
Editez debian / control, "Architecture: any" doit être remplacé par "Architecture: all". N'oubliez pas de définir la question comme suit;)
João Pinto Le
3
En plus de renommer le répertoire et de mettre à jour debian / changelog, vous devez créer l’archive .orig correspondant à la nouvelle version. Il s’agit d’une archive qui contient le contenu du répertoire source (sans inclure debian /).
João Pinto
1
Avec le répertoire include, ce que je fais habituellement est quelque chose comme: cp sourcedir.orig && rm -rf sourcedir.orig / debian && tar czvf filename.orig.tar.gz sourcedir.orig
João Pinto
1
Ajouter le --indepdrapeau à dh_makefera le paquet "Architecture: tout" De plus, le -bdrapeau n'existe pas à partir de 11.04.
andrewsomething
1
Après avoir construit le paquet .deb, vérifiez les erreurs et les améliorations avec lintian somescripts_0.1-1_i386.debou lintian package-source.changes- voir: packaging.ubuntu.com/html/…
rubo77