So verwenden Sie FPM zum einfachen Erstellen von Paketen in mehreren Formaten

Einführung

Die von verschiedenen Linux-Distributionen verwendeten Paketformate können für Softwareentwickler, die ihre Projekte auf einfach zu konsumierende Weise veröffentlichen möchten, ein Schmerzpunkt sein. Debian und Ubuntu verlassen sich auf + .deb + - Pakete, während Fedora und RedHat beide Packsysteme im + .rpm + - Stil verwenden. Diese sind inkompatibel und die Werkzeuge, die für ihre Erstellung benötigt werden, können für diejenigen, die mit den jeweiligen Exzentrizitäten nicht vertraut sind, schwierig zu handhaben sein.

Während Paketbetreuer für Distributionen für Pakete, die in den offiziellen Repositories enthalten sind, das Schwergewicht legen, sollten Sie Pakete in der Regel selbst bereitstellen, wenn Sie vorhaben, Software für diese Distributionen auf Ihrer eigenen Site freizugeben oder Pakete für Ihre Organisation erstellen. Dies beinhaltete traditionell das Erlernen der Funktionsweise von mindestens einigen Werkzeugen für jede der Verpackungsfamilien.

Um die Komplikationen dieses Prozesses zu minimieren, wurde ein Tool namens "+ fpm " erstellt. Mit ` fpm ` können Sie auf einfache Weise sowohl ` .deb ` als auch ` .rpm ` Dateien erstellen, ohne die Befehle der verwendeten Verpackungswerkzeuge kennen zu müssen. In diesem Handbuch werden wir erläutern, wie Sie mit ` fpm +` Pakete in verschiedenen Formaten mit einem Ubuntu 14.04-Server erstellen.

FPM installieren

Die Hauptverteilungsmethode für das + fpm + - Tool selbst ist Ruby. Wir können unser System auf die Installation von + fpm + vorbereiten, indem wir sowohl die Ruby-Entwicklungspakete als auch die Software-Erstellungstools installieren, die zum Kompilieren zusätzlicher Software erforderlich sind.

Aktualisieren Sie zuerst Ihren lokalen Paketcache und fahren Sie dann mit den vorausgesetzten Installationen fort:

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

Sobald die oben genannten Pakete installiert sind, können Sie das Paket + fpm + selbst erwerben, indem Sie Folgendes eingeben:

sudo gem install fpm

Dadurch wird "+ fpm +" auf der Systemebene installiert und jedem Benutzer auf dem System zur Verfügung gestellt. Herkömmliche Methoden zum Packen empfehlen, dass Sie Pakete als normaler Benutzer ohne Rootberechtigung erstellen. Dies ist sicherer im Falle eines Verpackungsfehlers, der Ihr System beeinträchtigen kann.

Sie sollten nun die ausführbare Datei "+ fpm +" auf Ihrem System haben. Sie können dies überprüfen, indem Sie die zahlreichen Hilfeinformationen des Tools lesen:

fpm --help
Intro:

 This is fpm version 1.2.0

 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
 [email protected]

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

Sie können nun mit dem Erstellen von Paketen beginnen.

Machen Sie sich mit der grundlegenden FPM-Funktionalität vertraut

Das + fpm + Tool kann Ihnen ziemlich gut sagen, was es benötigt, um eine Paket-Erstellung abzuschließen. Um sich einen Überblick über die grundlegendsten Anforderungen zu verschaffen, können Sie den Befehl ohne Argumente aufrufen:

fpm
Missing required -s flag. What package source did you want? {:level=>:warn}
Missing required -t flag. What package output did you want? {:level=>:warn}
No parameters given. You need to pass additional command arguments so that I know what you want to build packages from. For example, for '-s dir' you would pass a list of files and directories. For '-s gem' you would pass a one or more gems to package from. As a full example, this will make an rpm of the 'json' rubygem: `fpm -s gem -t rpm json` {:level=>:warn}
Fix the above problems, and you'll be rolling packages in no time! {:level=>:fatal}

Diese Ausgabe erklärt uns die Grundlagen dessen, was wir zum Erstellen eines Pakets bereitstellen müssen. Ein typischer Aufruf sieht in seiner Grundform so aus:

fpm -s  -t

Die Quelle kann ein beliebiger Typ sein. Der Quellentyp bestimmt auch, wie der Quellenname oder -speicherort an den Befehl übergeben wird. Wir werden die möglichen Eingabe- und Ausgabeformate im nächsten Abschnitt diskutieren.

Für einige Formate müssen zusätzliche Hilfsprogramme für den jeweiligen Pakettyp installiert werden, um konvertiert werden zu können. Da wir die Ruby Essentials bereits installiert haben, um "+ fpm " zum Laufen zu bringen, und da wir ein Ubuntu-System verwenden, sollte es möglich sein, eine Ruby Gem-Datei in ein " .deb +" -Paket zu konvertieren.

Wählen wir einen häufig verwendeten Edelstein wie "+ Bündler ". Wir können ein " .deb " - Paket aus dem " bundler +" - Paket erstellen, das sich auf rubygems.org befindet, indem wir Folgendes eingeben:

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

Eine Datei mit dem Namen "+ rubygem-bundler_1.6.5_all.deb " wurde im lokalen Verzeichnis erstellt (Ihre Versionsnummer kann davon abweichen). Wir können dies nun wie jedes andere ` .deb +` Paket installieren:

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

Wenn Sie die Liste der installierten Edelsteine ​​überprüfen, werden Sie feststellen, dass wir jetzt einen Bundler zur Verfügung haben:

gem list
*** LOCAL GEMS ***

arr-pm (0.0.9)
backports (3.6.0)

cabin (0.6.1)
childprocess (0.5.3)
clamp (0.6.3)
ffi (1.9.3)
fpm (1.2.0)
json (1.8.1)

Wir hätten genauso gut ein anderes Quell- oder Ausgabeformat verwenden können, aber diese erfordern einige zusätzliche Tools auf unserem System, um die Formate zu konvertieren. Wir werden das später besprechen.

Quell- und Zielformate

Das + fpm + Tool kann mit vielen verschiedenen Quell- und Zielformaten arbeiten. Diese haben jeweils ihre eigenen Anforderungen und Merkmale.

Für den Fall, dass für ein Format ein relativ standardmäßiger Paketindex online ist (z. B. rubygems.org für Ruby Gem-Dateien), kann + fpm + den Index automatisch durchsuchen und die erforderlichen Dateien herunterladen. Es wird zuerst nach einer Übereinstimmung im aktuellen Verzeichnis gesucht und dann im Index gesucht, wenn keine lokale Übereinstimmung gefunden wird.

Die folgenden Quelltypen werden derzeit unterstützt:

Source Type Source Description How to Pass Source Name or Location Additional Packages Needed

dir

Directory or files

Pass the absolute or relative path(s) of the project files on the local filesystem.

(none)

tar

A tarball source package

Pass the path to the location of the tarball (compressed or uncompressed) on the local filesystem.

(none)

gem

A Ruby gem

Pass the name of a Ruby gem that can be find on www.rubygems.org. It will be auto-downloaded to create the package.

ruby, rubygems-integration

python

A Python package

Pass the name of a Python package as you would pass it to easy_install. Names are searched for in the Python Package Index and auto-downloaded to create the package.

python-setuptools

pear

A PHP extension

Pass the name of a PHP extension or application found on pear.php.net. The appropriate files will be auto-downloaded when creating the package.

php-pear

cpan

A Perl module

Pass the name of a Perl module as found at cpan.org. The files will be auto-downloaded and used to build the package.

cpanminus

zip

A zipped directory structure

Pass the location on the local filesystem of a zip file containing the package.

zip

npm

A Node.js module

Pass the name of a Node module as specified on npmjs.org. The package will be auto-downloaded and used to make the output package.

npm

osxpkg

An OS X package

Pass the location on the local filesystem of an OS X package (this will only work on OS X systems with pkgbuild in their path).

pkgbuild (only available for OS X systems)

empty

(no source)

Used to create a package without any actual packages. This is used most often for meta-packages that only contain dependencies.

(none)

deb

A .deb package

Pass the location of a .deb file on the local filesystem.

(none on Debian-based systems)

rpm

An .rpm package

Pass the location of an .rpm file on the local filesystem.

rpm

Es gibt auch einige Optionen für die Zielverpackungsformate, die Sie erstellen möchten. In der folgenden Tabelle werden einige der verschiedenen Optionen beschrieben:

Output Type Output Description Additional Packages Needed

deb

A Debian-style package that can be installed on Debian or Ubuntu systems.

(none on Debian-based systems)

rpm

A RedHat-style package that can be installed on CentOS, Fedora, or RedHat systems.

rpm

zip

A zip file containing the directory and file structure of the input package.

zip

tar

A tarball (compressed or uncompressed) of the directory structure of the input package.

(none)

dir

A directory in which to extract the inputted package.

(none)

sh

A self-extracting .sh file. This is a shell script with a bzipped tar file that will be extracted when run.

(none)

osxpkg

A package file for OS X. You must be working on an OS X installation with pkgbuild installed to create these packages.

pkgbuild (only available for OS X systems)

solaris

A package suitable for installing on a Solaris system. You must have pkgproto and pkgmk installed, which are only available on Solaris machines.

pkgproto, pkgmk (only available on Solaris systems)

pkgin

A package suitable for installing on BSD systems. You must have the pkg_create package installed, which is only available on BSD systems.

pkg_create (only available on BSD systems)

puppet

A puppet module that can be used to install on various systems. ().

(cannot test in non-working state)

Wie Sie sehen, müssen Sie für einige Formate sowohl für die Quell- als auch für die Zielspezifikation auf einem bestimmten Betriebssystem arbeiten. Da wir dieses Tool unter Ubuntu 14.04 demonstrieren, sind die Ausgabeformate "+ osxpkg " und " osxpkg ", " solaris " und " pkgin +" nicht verfügbar.

Ändern des FPM-Verhaltens mit Optionen

Unter Verwendung der Informationen aus den Tabellen im obigen Abschnitt sollten Sie in der Lage sein, einige Basispakete mit den Standardeinstellungen "+ fpm +" zu erstellen. Meistens möchten Sie jedoch einige zusätzliche Informationen bereitstellen, um das resultierende Paket zu formen.

Optionen sollten vor den Quellargumenten angegeben werden, die den Speicherort oder den Namen des Originalpakets angeben.

Es gibt viele verschiedene Optionen für + fpm +. Wir werden im Folgenden nur einige der gebräuchlichsten behandeln. Eine vollständige Liste erhalten Sie mit dem Befehl + fpm --help +.

Einige gängige Optionen, die Sie möglicherweise verwenden möchten, sind:

  • * -C *: Geben Sie ein Verzeichnis an, in das gewechselt werden soll, bevor nach Dateien gesucht wird.

  • * –Prefix *: Ein Verzeichnispfad, der angibt, wo die Dateien im resultierenden Paket installiert werden.

  • * -p *: Der Paketname und der Pfad für Ihr Paket. Dies kann den Dateinamen der resultierenden Paketdatei überschreiben.

  • * -n *: Der Name, den Sie für das Paket verwenden möchten. Dies ist der Name, der in den Pakettools für Ihre Plattform angezeigt wird.

  • * -v *: Die Versionsnummer, die Sie für Ihr Paket verwenden möchten.

  • * –Iteration *: Die Versionsinformationen für das Paket. Der Name der Distribution für diese Nummer variiert, aber es ist im Allgemeinen eine Möglichkeit, die Paketversion im Gegensatz zur Anwendungsversion zu verfolgen.

  • * –License *: Der Lizenzname für das Paket. Dies schließt den Lizenztyp in die Metadaten für das Paket ein, schließt jedoch die zugehörige Lizenzdatei nicht in das Paket selbst ein.

  • * –Category *: Die Kategorie, zu der dieses Paket gehört. Dies kann verwendet werden, um das Paket innerhalb von Repos zu organisieren.

  • * -d *: Dies kann mehrfach verwendet werden, um die Abhängigkeiten des Pakets anzugeben.

  • * –Provides *: Hiermit kann die Systemfunktionalität angegeben werden, die dieses Paket bereitstellt. Dies wird im Allgemeinen verwendet, wenn es mehr als eine Auswahl gibt, um eine Anforderung zu erfüllen.

  • * –Conflicts *: Wird verwendet, um Pakete anzugeben, die nicht installiert werden dürfen.

  • * –Replaces *: Wird verwendet, um Pakete anzugeben, die bei der Installation dieses Pakets entfernt werden sollen.

  • * –Config-files *: Dient zum Markieren von Dateien im Paket als Konfigurationsdateien. Im Allgemeinen behalten Paketmanager diese Einstellungen bei, wenn das Paket entfernt wird.

  • * –Directories *: Markiert ein Verzeichnis als Eigentum des Pakets.

  • * -a *: Geben Sie die Architektur für das Paket an.

  • * -m *: Überschreibt das Paketverwalterfeld. Standardmäßig wird "+ Benutzername @ Host +" für dieses Feld verwendet.

  • * -e *: Überprüfen und bearbeiten Sie die Spezifikationsdatei manuell, bevor Sie das Paket erstellen. Dies kann verwendet werden, um die Standardeinstellungen zu optimieren, die für die Paketspezifikationen verwendet wurden.

  • * –Description *: Geben Sie die Beschreibung für das Paket ein.

  • * –Nach-der-Installation *, * –vor-der-Installation *, * –nach-der-Entfernung *, * –vor-der-Entfernung *: Skriptdateien, die zum richtigen Zeitpunkt ausgeführt werden sollten.

Es gibt auch einige Optionen, die für die ausgewählten Verpackungsformate spezifisch sind. Eine vollständige Liste finden Sie in der Hilfe.

Anpassen von Paketen

Wenn Sie weitere Details anpassen und nicht möchten, dass ein Format direkt in Ihr Ausgabeformat übersetzt wird, müssen Sie möglicherweise einen anderen Arbeitsablauf verwenden.

Dieser Prozess wird traditionelle Verpackungen ein wenig genauer abbilden, bietet jedoch auch den Vorteil, dass mehrere Ausgabeformate schnell erstellt werden können. Wir können den folgenden allgemeinen Arbeitsablauf veranschaulichen, vorausgesetzt, die betreffende Anwendung verwendet einen standardmäßigen Kompilierungs- und Installationsprozess +. / Configure +, + make +, + make install +.

Installieren Sie zunächst alle Abhängigkeiten, die Sie für das Paket benötigen. Holen Sie sich dann das Quellpaket für das Projekt von seiner Website und platzieren Sie es in einem Arbeitsverzeichnis:

mkdir ~/build
cd ~/build
wget

Jetzt können Sie die Datei extrahieren und in das resultierende Verzeichnis wechseln:

tar xzvf .tar.gz
cd

In diesem Verzeichnis befinden sich die Quelldateien für die Anwendung, die Sie packen möchten. Sie haben jetzt die Möglichkeit, einige Änderungen an den Dateien vorzunehmen und einige Optionen zu konfigurieren.

Die normale Möglichkeit, Optionen während des Erstellungsprozesses anzugeben, besteht darin, das enthaltene Skript +. / Configure + zu verwenden. In der Projektdokumentation finden Sie Informationen zu den verfügbaren Kompilierungsoptionen. Sie können sie angeben, indem Sie das Skript + configure + mit Ihren Optionen aufrufen:

./configure --= --= -- ...

Dadurch werden die Dateien erstellt oder geändert, die beim Erstellen des Pakets vom Befehl "+ make +" gelesen werden. Jetzt können wir die eigentlichen Installationsdateien erstellen, indem wir Folgendes eingeben:

make

Anstatt diese Dateien zu installieren, die wir auf unserem System konfiguriert haben, installieren wir sie in einem leeren Dummy-Verzeichnis, aus dem wir ein echtes Paket erstellen können. Erstellen Sie ein Verzeichnis, in das das Paket installiert werden soll:

mkdir -p /tmp/

Wir können dieses neue Verzeichnis als Root-Installationsverzeichnis kennzeichnen, indem wir die Option "+ DESTDIR " an " make install +" übergeben:

make DESTDIR=/tmp/ install

Unser Paket wurde nun sauber in ein leeres Verzeichnis installiert. Es hat die gesamte erforderliche Verzeichnisstruktur erstellt, es gibt jedoch nichts, was nicht mit dem Paket in diesem Verzeichnis zusammenhängt.

Dies ist Ihre zweite Möglichkeit, Ihr Setup anzupassen. Wenn Sie zusätzliche Dateien für die Installation in die Hierarchie aufnehmen möchten, können Sie diese jetzt an der entsprechenden Stelle in dieser Struktur hinzufügen.

Wenn Sie fertig sind, können Sie mit + fpm + die entsprechende Paketdatei erstellen. Zum Beispiel können wir einige Versionsinformationen und eine Beschreibung des Pakets in unserem Befehl + fpm + übergeben. Wir könnten auch Abhängigkeitsinformationen auflisten oder zusätzliche Details angeben, die sich auf die Erstellung der Verpackungs-Metadateien auswirken.

Wir können die Verzeichnisstruktur verwenden, um mehrere Verpackungsformate zu erstellen. Zum Beispiel könnten wir dann ein + .deb + - Paket erstellen, indem wir Folgendes eingeben:

fpm -s dir -t deb -C /tmp/ --name  --version  --iteration  --depends  --description "A sample package" .

Dadurch wird ein Paket mit dem Namen "+ Projektname_1.0.0-1_amd64.deb +" im aktuellen Verzeichnis erstellt.

Sie können dann einige der Optionen ändern, um ein "+ .rpm " - Paket zu erstellen (vorausgesetzt, Sie haben das " rpm +" - Paket aus den Repositorys installiert):

fpm -s dir -t  -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends  --description "A sample package" .

Dadurch wird ein Paket mit dem Namen "+ project_name-1.0.0-1.x86_64.rpm +" in Ihrem aktuellen Verzeichnis erstellt.

Wie Sie sehen, ist es mit + fpm + ziemlich einfach, angepasste Pakete zu erstellen. Die meisten schwierigen Aufgaben werden immer noch vom Tool erledigt.

Fazit

Die Verwendung von + fpm + kann Ihnen das Leben erleichtern, wenn Sie versuchen, Pakete für die gesamte Infrastruktur zu erstellen oder öffentlich herunterladbare Pakete Ihres Projekts zu verteilen. Obwohl es aus politischen Gründen möglicherweise nicht die ideale Lösung für das Packen der Repositorys einer tatsächlichen Distribution ist, sind seine Vorteile in vielen Szenarien attraktiv.