# Paketverwaltung

Eine Paketverwaltung (englisch package management software) ermöglicht die komfortable Verwaltung von Software, die in Form von Programmpaketen vorliegt. Dazu gehören Installieren, Aktualisieren und Deinstallieren.

## Arbeitsweise

Voraussetzung für die Paketverwaltung ist, dass die zu installierende Software als entsprechendes Paket vorliegt. Typischerweise liegen diese Pakete in einem zentralen Repository. Änderungen, welche die Paketverwaltung zur Installation des Pakets vornehmen muss, werden von dieser aus dem Paket ausgelesen und umgesetzt. Erkennt die Paketverwaltung dabei, dass noch weitere Software für das Funktionieren benötigt wird (sogenannte Abhängigkeit, z. B. eine Programmbibliothek), aber noch nicht installiert ist, warnt sie entweder oder versucht, die fehlende Software mit den ihr zur Verfügung stehenden Mitteln, ebenfalls aus dem Repository, nachzuladen und vorweg zu installieren.
Soll eine installierte Software gelöscht werden, nimmt die Paketverwaltung dann wieder die Informationen des Pakets, um es anhand dessen Konfiguration zu ändern und Dateien zu löschen.
Bei Linux-Distributionen ist typischerweise eine Paketverwaltung integriert, deren Repository von dem Betriebssystemanbieter zentral erstellt, angeboten und gepflegt wird. Paketverwaltungen werden außerdem bei der Softwareentwicklung eingesetzt, um Software-Tools in die Entwicklungsumgebung zu laden, die für die Erstellung einer Software benötigt werden, oder um Abhängigkeiten zu laden, die direkt in die zu erstellende Software integriert werden.

## Eigenschaften

Mit einer Paketverwaltung vereinfacht sich die Installation eines Programms erheblich, da Programme nicht erst einzeln heruntergeladen, kompiliert und installiert werden müssen. Außerdem überwachen die meisten Paketverwaltungen Konflikte zwischen Paketen mit gleichen Inhalten und verhindern so eine Systeminstabilität in dieser Beziehung.
Ebenso ist das Löschen von Software deutlich vereinfacht: Da die Paketverwaltung sich alle zu einem Paket gehörende Software merkt, kann bei einem Löschen eines Paketes sämtliche nicht mehr benötigte Software mit entfernt werden.

### Definitionsüberschneidung

Es gibt genau genommen zwei Arten von Paketverwaltungen: Auf der einen Seite stehen die Programme, die aus anderen Quellen Pakete nachladen können, um Abhängigkeiten aufzulösen, auf der anderen Seite diejenigen Programme, die direkt die Pakete installieren oder löschen, aber keine Abhängigkeitsverwaltungs- und Konfliktlösungsmechanismen kennen.
Zwei konkrete Fälle: Das Programm RPM kann Pakete vom Typ *.rpm installieren und löschen, das Programm Dpkg kann Pakete vom Typ *.deb installieren und löschen. Beide können aber keine Abhängigkeiten auflösen, da sie keine Funktionen haben, um Software nachzuladen. Dies können höhere Schichten der Paketverwaltungen wie YUM, APT, pkg-get und andere.

### Aufbau der Pakete

Ein Paket enthält neben den reinen Programmdateien auch Informationen, wo diese Programmdateien abgelegt werden sollen, welche Konfigurationen am bestehenden System vorgenommen werden müssen, und meist auch, ob und wenn, welche Software noch zusätzlich benötigt wird, damit das Programm funktioniert. Bei der Installation werden die Programmdateien im Paket in das laufende oder zu installierende System hinein entpackt, danach werden die Installationsskripte ausgeführt.
Es gibt mehrere konkurrierende Paketformate, die von unterschiedlichen Paketverwaltungen verarbeitet werden. Die wichtigsten sind:
* pkgadd (und weitere Programme) die 1984 von AT&T für Unix eingeführte Paketverwaltung
* RPM Package Manager (RPM), bei Red Hat, Fedora, Mandriva, OpenSUSE etc. verwendet
* Debian Package Manager (dpkg) mit .deb-Dateien, bei Debian und Derivaten (z. B. Ubuntu) zu finden
* Slackware verwendet Pakete, die im Archivierungsformat TGZ (tar.gz) und (seit Slackware 13) TXZ (tar.xz) gepackt werden, gern als Tarball bezeichnet
* Portage bei Gentoo
* Package (.pkg) und Metapackage (.mpkg) für macOS
* FreeBSD und OpenBSD benutzen sowohl BSD-Ports, also Makefiles, die den gesamten Build-Prozess vom Herunterladen des Quellcodes bis zum Installieren enthalten, als auch Binärpakete im tar.gz-Format.
* iPKG ist ein Format für Computer mit wenigen Ressourcen (z. B. WLAN-Router) u. a. von OpenWrt verwendet
* NuSpec (.nuspec) ist ein Format für NuGet-Pakete
* Flatpak eine distbutionsübergeifende Paketverwaltung, mit eigenem Framework für ein Sandboxing der Anwendungen.
* Snappy eine Paketverwaltung, in der Pakete keine Abhängigkeiten von anderen Paketen haben.
* Oneget eine Paketverwaltung, die in Windows 10 integriert ist und mit der PowerShell bedient werden kann. Pakete dafür gibt es aber bisher kaum.

### Paketerstellung

Pakete zu erstellen ist nicht trivial. Auch in kleinen Projekten gibt es meistens einen Packager, der dafür verantwortlich ist, dass Pakete funktionieren.
Der Packager nimmt die Programmquellen und trägt in einer Datei ein, welche Programme zur Kompilierung benötigt werden. Dann erstellt er Regeln, wie sich das Programm automatisiert kompilieren lässt. Außerdem sammelt und schreibt er Patches, welche automatisch eingespielt werden, und schreibt eine kurze Beschreibung des Pakets.
Das fertige Quellpaket kann nun automatisch für die gewünschte Plattform vorkompiliert werden.

### Besondere Pakete

Zu beachten ist, dass bei einigen Linux-Distributionen viele Pakete zweimal vorkommen. Dabei handelt es sich beim zweiten Eintrag um das eigentliche Paket mit einem nachgestellten dev oder devel. Diese Abkürzung steht dabei für Development (englisch für Entwicklung), was darauf hinweist, dass dort Dateien enthalten sind, die für das Funktionieren des Programms nicht wichtig sind, aber gebraucht werden, wenn man darauf aufbauend weitere Software entwickeln will.

## Vor- und Nachteile

Paketverwaltungen werden als einer der großen Vorteile und Erfolge der unixoiden Betriebssysteme beschrieben, z. B. von Ian Murdock als „the single biggest advancement Linux has brought to the industry“. Eine weitere typische Eigenschaft dieser ist jedoch auch die Verwischung der Grenzen zwischen Anwendungen und Betriebssystem durch die integrierte Verwaltung durch die Distributionen, d. h. das Betriebssystem agiert nicht als Plattform für Anwendungen, sondern beinhaltet diese. Einerseits ist mit einem systemweiten Paketmanagement ein konfliktfreier Betrieb (ohne Bibliotheks-Konflikte) des Betriebssystems mit den Applikationen sichergestellt, andererseits wird eine direkte Verteilung von Anwendungssoftware durch den Entwickler an die Kunden schwieriger sowie auch die Erstellung von Portable Software. Durch inkompatible Pakete zwischen den Distributionen ist die Verbreitung von Software ebenfalls erschwert; hiergegen versucht die LSB, Standards zu definieren und zu verbreiten, bis jetzt jedoch nur mit begrenztem Erfolg.
Auch kann es bei der Softwareverwaltung zu Konflikten kommen (die aber erkannt werden): Sind in den Paketen A und B teilweise gleiche Dateien enthalten, können nicht beide Pakete gleichzeitig installiert werden. Auf einem System ohne eine Paketverwaltung würden die Dateien überschrieben, was zu Problemen bei der Ausführung der betroffenen Software führen kann. Ebenso kann es passieren, dass bei einer Aktualisierung des Pakets X auch die Aktualisierung des Pakets Y gefordert wird, Paket Z aber fordert, dass Y die Version beibehält – eine Aktualisierung ist dann nicht möglich. Es zeichnet eine gute Paketverwaltung aus, Konflikte und Abhängigkeiten richtig zu berechnen und zur bestmöglichen Lösung zu kommen, also die richtigen Pakete zu aktualisieren, wenn nötig veraltete Pakete zu löschen und den Konflikt so bestmöglich zu lösen.
Quellenbasierte Distributionen wie etwa Gentoo Linux begegnen diesen Problemen so: Hier werden die Software-Pakete erst auf dem Zielrechner kompiliert. Dabei ist es auch möglich, die Komponenten und damit die Abhängigkeiten eines Paketes anzupassen. Sollte ein bereits installiertes Paket nicht die benötigten Bibliotheken für ein neues Paket installiert haben, wird es kurzerhand neu übersetzt und erneut installiert.

## Alternativen und verwandte Konzepte

Nix ist ein alternatives funktionales Paketmanager-System, welches einige der Nachteile traditioneller Paketmanager überwinden soll, beispielsweise die distributionsübergreifende „Dependency-Hell“.
Applikationsverbreitung über „Containerisation“ oder „App-Verzeichnisse“ ist ein alternativer Ansatz, der seit Mitte der 2000er für unixode Systeme ausprobiert wird und der auf eine konsequente Isolation vom Grundsystem anstelle einer wohldefinierten Integration in das Grundsystem setzt. Eines der ersten Beispiele hierfür war Autopackage 2005; weitere sind Zero Install, PortableLinuxApps oder Docker.
Ein der Paketverwaltung nahestehendes Konzept haben aktuelle App Stores, die vor allem für Smartphones zum Einsatz kommen, beispielsweise der Google Play Store, Mac App Store, Samsung Galaxy Store oder der Microsoft Store. Obwohl sie technisch teilweise auf den gleichen Grundlagen aufbauen wie klassische Paketverwaltungen, gibt es auch signifikante konzeptuelle Unterschiede, beispielsweise bilden App-Stores eher eine dezentrale „Binärplattformanbieter-zu-ISV“-Architektur anstelle einer zentralisierten Distrostruktur ab.

## Beispiele für Paketverwaltungen

* Debian Package Manager + Advanced Packaging Tool (APT) – für deb- oder RPM-basierte Linux-Distributionen
* autopackage – ein distributionsunabhängiges Softwareinstallationssystem
* Click’n'Run (CnR) – für Linspire (basierend auf Debians APT)
* NuGet – für Visual Studio
* gem – für Ruby-Pakete via RubyGems
* iPKG/opkg – eine Paketverwaltung speziell für Computer mit wenig Ressourcen, wird z. B. von OpenWrt verwendet
* Pacman von Arch Linux
* Perl Package Manager – für Active Perl Module
* Paketverwaltung PiSi der Linux-Distributionen Pardus und Solus
* pkgsrc für NetBSD, DragonFly BSD und viele weitere Unix-artige Betriebssysteme
* emerge und Portage – für Gentoo
* Ports-System unter BSD-Distributionen (z. B. FreeBSD, OpenBSD)
* Smart Package Manager – dieses Werkzeug greift auf bestehende Werkzeuge (rpm, deb, …) zurück, und kann so auf vielen Distributionen eine einheitliche Oberfläche bieten
* Up2date – RPM-basiert
* User Red Hat Package Manager von Mandriva Linux – RPM-basiert
* rpm und YUM – für die Linux-Distributionen Fedora und Yellow Dog Linux
* xbps – für Void Linux
* Zypper/YaST unter OpenSUSE
* npm – für Webentwicklung
* yarn – Alternativer Client zur Nutzung der npm Registry
* Chocolatey – ist ein freier Paketmanager für Windows-Betriebssysteme
* Package-Launcher – Ein Paketmanager und Automatisierungstool für Softwarepakete in Windows-Betriebssystemen
* Windows Package Manager oder kurz winget – ein Paketmanager von Microsoft für Windows ab Version 10 1709