Was ist ein Paketmanager? Ein klarer, praktischer Leitfaden

  • VersionDude
  • Werkzeuge
  • 6 Min. Lesezeit

Ein Paketmanager ist ein Werkzeug, das Software und ihre Abhängigkeiten aus einem Repository installiert, aktualisiert und entfernt, damit Sie nicht jedes Teil von Hand aufspüren und verbinden müssen. Was sie sind, die wichtigsten Typen, wie Versionsauflösung und Lockfiles funktionieren und die Praktiken, die Installationen sicher und reproduzierbar machen.

Ein Paketmanager ist ein Werkzeug, das Software - samt allem, wovon diese Software abhängt - installiert, aktualisiert und entfernt, indem es sie aus einem Repository holt. Statt Dateien von Hand herunterzuladen, an den richtigen Stellen zu entpacken und zu hoffen, jedes Teil gefunden zu haben, bitten Sie den Paketmanager um das Gewünschte, und er erledigt die Arbeit: Er findet das Paket, zieht die weiteren benötigten Pakete hinzu, legt sie an die richtige Stelle und protokolliert, was er installiert hat. Dieses Protokoll ist es, das ihm später erlaubt, dasselbe sauber zu aktualisieren oder zu entfernen.

Das Problem, das er löst: Abhängigkeiten

HTML-Quellcode geöffnet in einem Code-Editor
HTML-Quellcode geöffnet in einem Code-Editor

Paketmanager gibt es, weil kaum eine Software allein steht. Ein Programm hängt in der Regel von Bibliotheken ab, und diese Bibliotheken hängen von weiteren Bibliotheken ab und bilden eine Kette, die man transitive Abhängigkeiten nennt. Das von Hand zu ordnen ist langsam und fehleranfällig: Man muss jede Abhängigkeit finden, eine kompatible Version wählen, sie in der richtigen Reihenfolge installieren und den ganzen Vorgang auf jeder Maschine wiederholen. Ein Paketmanager erledigt das automatisch, weshalb er zu einem Standardbestandteil nahezu jedes Betriebssystems und jeder Programmiersprache geworden ist.

Paketmanager des Betriebssystems

Der erste große Typ ist der Paketmanager des Betriebssystems, der Software und Systembibliotheken für die ganze Maschine installiert. Auf Debian und Ubuntu ist das apt, auf Fedora und Red Hat ist es dnf, auf macOS nutzen viele Entwickler Homebrew (den Befehl brew), und unter Windows gibt es winget. Diese Werkzeuge ziehen aus gepflegten Repositories von Paketen, die für dieses System gebaut wurden, verwalten die Abhängigkeiten zwischen ihnen und halten die installierte Software mit einem einzigen Befehl aktuell.

  • Installiert, aktualisiert und entfernt Software samt Abhängigkeiten
  • System-Manager: apt, dnf, Homebrew, winget
  • Sprach-Manager: npm, pip, cargo, Composer
  • Versionsauflösung + Lockfiles machen Installationen reproduzierbar
  • Committen Sie das Lockfile und auditieren Sie Schwachstellen

Sprach- und Projekt-Paketmanager

Der zweite große Typ ist der Sprach- oder Projekt-Paketmanager, der die Bibliotheken installiert, die ein bestimmtes Projekt braucht, statt Software für die ganze Maschine. npm tut dies für JavaScript und Node.js, pip für Python, cargo für Rust und Composer für PHP. Sie lesen eine Manifestdatei in Ihrem Projekt, die die Abhängigkeiten auflistet, laden sie dann aus einer zentralen Registry in das Projekt herunter, damit Ihr Code sie nutzen kann, und halten jedes Projekt von den anderen isoliert.

Repositories, Registries und Versionsauflösung

Um seine Arbeit zu tun, spricht ein Paketmanager mit einem Repository oder einer Registry - einem zentralen Katalog veröffentlichter Pakete und ihrer Versionen. Wenn Sie ein Paket anfordern, geben Sie oft nicht eine exakte Version an, sondern einen Bereich, über eine Konvention wie die semantische Versionierung (semver), bei der Zahlen wie 2.4.1 signalisieren, wie groß eine Änderung ist. Der Manager führt dann die Versionsauflösung durch: Er ermittelt einen Satz von Versionen, der alle Anforderungen zugleich erfüllt, einschließlich aller transitiven Abhängigkeiten, damit nichts in Konflikt gerät.

Lockfiles und reproduzierbare Installationen

Da sich ein Versionsbereich im Laufe der Zeit zu unterschiedlichen exakten Versionen auflösen kann, schreiben die meisten modernen Paketmanager ein Lockfile. Ein Lockfile hält die genaue Version jedes tatsächlich installierten Pakets fest, sodass die nächste Person - oder der Build-Server - die das Projekt installiert, exakt denselben Satz erhält und nicht bloß einen kompatiblen. Genau das macht Installationen reproduzierbar: Das Manifest sagt in allgemeinen Worten, was Sie wollen, und das Lockfile legt fest, was Sie bekommen haben.

Gute Praktiken

Einige gute Praktiken folgen direkt daraus, wie diese Werkzeuge arbeiten. Committen Sie das Lockfile in die Versionsverwaltung, damit jeder und jede Umgebung einen identischen Satz von Abhängigkeiten installiert, was eine ganze Klasse von Läuft-bei-mir-Überraschungen beseitigt. Führen Sie den Audit-Befehl des Paketmanagers aus (viele, darunter npm und pip-basierte Werkzeuge, bieten einen an), um Ihre Abhängigkeiten gegen bekannte Schwachstellendatenbanken zu prüfen, und aktualisieren Sie bewusst, statt alte, ungepatchte Versionen liegen zu lassen.

Einige gute Praktiken folgen direkt daraus, wie diese Werkzeuge arbeiten. Committen Sie das Lockfile in die Versionsverwaltung, damit jeder und jede Umgebung einen identischen Satz von Abhängigkeiten installiert, was eine ganze Klasse von Läuft-bei-mir-Überraschungen beseitigt. Führen Sie den Audit-Befehl des Paketmanagers aus (viele, darunter npm und pip-basierte Werkzeuge, bieten einen an), um Ihre Abhängigkeiten gegen bekannte Schwachstellendatenbanken zu prüfen, und aktualisieren Sie bewusst, statt alte, ungepatchte Versionen liegen zu lassen.

- VersionDude

Fallstricke, auf die man achten sollte

Auch die Fallstricke sollte man kennen. Abhängigkeiten ungepinnt zu lassen - also die jeweils neueste Version zu akzeptieren - bedeutet, dass zwei Installationen sich leise unterscheiden können, sodass ein Build, der gestern funktionierte, heute ohne jede Änderung Ihrerseits kaputtgehen kann. Und weil Sie Code aus einer öffentlichen Registry ziehen, sind Paketmanager ein Ziel für Lieferketten-Angriffe, bei denen ein bösartiges oder gekapertes Paket unter einem vertraut aussehenden Namen veröffentlicht wird. Prüfen, was Sie hinzufügen, auf typosquattete Namen achten und Audits laufen lassen sind die alltäglichen Verteidigungen.

Insgesamt ist ein Paketmanager eines der nützlichsten Werkzeuge, die ein Entwickler hat: Er verwandelt das Gewirr aus Finden, Versionieren und Installieren von Software in ein paar Befehle, und sein Lockfile macht das Ergebnis über Maschinen hinweg wiederholbar. Lernen Sie den, den Ihr Betriebssystem und Ihre Sprache verwenden, committen Sie Ihr Lockfile, auditieren Sie Ihre Abhängigkeiten, und das Installieren von Software wird zu einem routinemäßigen, verlässlichen Schritt statt zu einer Quelle von Überraschungen.

Verwandtes Projekt