binfalse hat mich dazu gebracht diesen Artikel zu schreiben. Die verschiedenen Paketformate der Linux-Distrubutionen können Softwareentwickler vor Probleme stellen, die ihre Software leicht installierbar gestalten möchten. Debian und Ubuntu setzen auf deb-Pakete während RedHat und Fedora auf rpm-Pakete setzen. Diese beiden Fromate nicht nicht kompartibel zueinander. Die Werkzeuge, um die Pakte zu erstellen können viele als unnötig kompliziert befinden. Das schreckt ab, wenn man das Paket nur für sich oder für eine kleine Gruppe von Nutzern baut. Es ist auch durchaus sinnvoll Sktripte zu paketetieren, da sich die Paketverwaltung um die Anhänigkeiten kümmern kann.

Um unnötige Komplikationen zu vermeiden, gibt es Tool fpm. Es kann unter anderm deb- und rpm-Pakete erstellen. fpm ist in ruby geschrieben. Aus diesem Grund muss man etwas Vorarbeit leisten.

Installation von fpm unter Ubuntu/Debian

sudo apt-get update
sudo apt-get install ruby-dev build-essential
sudo gem install fpm

Wenn das gem fpm installiert ist, dann gibt es den Befehl fpm im PATH. Man kann das ganze wie folgt testen:

fpm -h
Intro:

  This is fpm version 1.3.3

  If you think something is wrong, it's probably a bug! :)
  Please file these here: https://github.com/jordansissel/fpm/issues

  You can find support on irc (#fpm on freenode irc) or via email with
  fpm-users@googlegroups.com

Usage:
    fpm [OPTIONS] [ARGS] ...

...

Nun kann man anfangen Pakte zu bauen. Ein Aufruf sieht im einfachsten Fall so aus: fpm -s source_type -t target_type source_name_or_location Der source_type bzw. target_type können die verschiedensten Paketformate sein. Einige Pakettype benötigen Hilfsprogramme, damit fpm sie erstellen kann. Da ich annehme, dass fpm auf einen Debian bzw. Ubuntu benutzt wird, zeige ich im folgenden Beispiel wie man aus einen ruby ein deb-Paket baut.

fpm -s gem -t deb bundler
Erstellt package {: path => "rubygem-bundler_1.6.5_all.deb"}

Es wird die Datei rubygem-bundler_1.6.5_all.deb im aktuellen Verzeichnis erstellt. (Ihre Versionsnummer kann abweichen). Diese kann man dann ganz einfach installieren (oder zu einen Repository hinzufügen).

sudo dpkg -i rubygem-bundler_1.6.5_all.de

Wenn die Quelle ein Standart Reporitory wie rubygems.org für ruby gems oder npm für nodejs Pakete, dann ist fpm in der Lage automatisch alle benötigten Dateien herunterzuladen.

Es ist auch sehr einfach möglich fremde Software zu packen, welche man compilieren muss. Im Allgemeinen sieht das wie folgt aus:

# Vorbereitung
mkdir ~/build
cd ~/build
git clone https://github.com/cool/cool-app
cd cool-app

# bauen
make
mkdir -p /tmp/cool-app 
make install DESTDIR=/tmp/cool-app
fpm -s -t dir deb -C /tmp/cool-app \
  --name cool-app-name \
  --version 1.0.0 \
  --iteration 1 \
  --depends "Abhänigkeit 1 (>= 2.0.0)" \
  --depends "Abhänigkeit 2" \
  --description "Ein Beispielpaket" \
 .

fpm -s -t dir rpm -C /tmp/cool-app \
  --name cool-app-name \
  --version 1.0.0 \
  --iteration 1 \
  --depends "Abhänigkeit 1 (>= 2.0.0)" \
  --depends "Abhänigkeit 2" \
  --description "Ein Beispielpaket" \
  .

Man erhält dann im aktuellen Verzeichnis ein rpm- und ein deb-Paket. So kann man einfach und schnell Pakete für das eigene System bauen oder für andere, wenn man z.B. selbst Software bereit stellt. Man kann auch statt des . am Ende des fpm-Komandos sagt, dass der gesamte Inhalt von unter /tmp/cool-app in das Paket soll. Man kann/sollte auch die Vezeichnisse einzeln angeben z.B. etc/cool-app usr/bin usr/share/man.

Sources

  • gem ruby-gem (automatischer Download)
  • python python-Module, welche easy_install unterstützen (automatischer Download)
  • pear php-Module (automatischer Download von pear.php.net)
  • dir Verzeichnis
  • tar tar-Archiv
  • pear php-Module (automatischer Download)
  • rpm rpm-Paket
  • deb deb-Paket
  • zip zip-Archiv
  • empty erzeugt ein leeres Paket, welches man oft für Metapakte benutzt
  • npm nodejs Module (automaticher Download)
  • cpan peal-Module (automatischer Download)
  • osxpkg Mac OS X Pakete (nur auf Mac verfügbar)

Targets

  • deb
  • rpm
  • zip
  • tar
  • dir
  • sh (selbst entpackendes Shell skript, welches ein bzip2 gepacktes tar enthält)
  • osxpkg (nur auf Mac verfügbar)
  • solaris Solaris Pakete (nur auf Solaris möglich)
  • pkgin BSD pakete (nur auf BSD möglich)
  • puppet (puppet-Modul, aktuell noch nicht implementiert)