~derf / interblag / entry / Paketsystem #2
dark mode

Das Paketgedoens besteht im wesentlichen aus 3 Skripten:

  • bootstrap wird z.B. per scp auf einen Host kopiert und erstellt dort ein paar Verzeichnisse (~/bin, ~/packages...) und installiert das "core"-Paket mit pkg und checklinks manuell.
  • checklinks liest die Datei .links im aktuellen Verzeichnis aus und erstellt daraus symlinks (hardlinks sind auch moeglich)
  • pkg installiert, aktualisiert und entfernt die Pakete und ruft z.B. checklinks auf

Ein Paket ist dabei folgendermassen aufgebaut:

.links Linkbeschreibungen fuer checklinks, z.B. "soft .zshrc packages/zsh/etc/rc" (relativ zu $HOME)
conflicts Konflikte mit anderen Paketen
dependencies Abhaengigkeiten auf andere Pakete
description Paketbeschreibung fuer pkg info
priority Integer-prioritaet des Pakets
bin/ Executables fuer ~/bin.
etc/ Konfigurationsdateien
hooks/ Shell-Snippets, die nach/vor dem installieren/updaten/entfernen eines Pakets ausgefuehrt werden
lib/ Sonstiges, z.B. Bilder
man/ Manpages im pod-format

Die Inhalte von bin/ und man/ werden automatisch von den entsprechenden Orten gesymlinkt und die Symlinks beim deinstallieren des Pakets auch wieder entfernt. Enthaelt bin/ Perlskripte mit pod, werden daraus ebenfalls automatisch manpages generiert. Der Wert aus priority wird beim Deinstallieren beruecksichtigt.

Als DVCS werden sowohl hg als auch git unterstuetzt.

Probleme dabei:

  • Es gibt keine Paketliste, weder auf dem Server noch lokal. D.h. Auf Updates wird bei mercurial via hg incoming und bei git gar nicht geprueft, ausserdem muss bei der Installation das DVCS separat angegeben werden. Die Updates sind dementsprechend sehr langsam.
  • Dadurch bedingt: Das Dependency- und Conflicts-System ist nicht 100%ig verlaesslich, Reverse-Dependencies z.B. fuer Paketdeinstallation gibt es nicht.
  • Das gesymlinke funktioniert mittlerweile recht gut, es gibt aber immer noch Faelle in denen tote Links entstehen koennen (z.B. wenn bei einem Paketupdate ein Eintrag aus .links verschwindet)
  • Es muessen mehrere Versionskontrollsysteme unterstuetzt werden, das Frontend (pkg) muss also entweder den kleinsten gemeinsamen Nenner bieten oder ein System (in diesem Fall git) wird nicht vollstaendig unterstuetzt.

Alles in allem funktioniert es aber erstaunlich gut, und entgegen anderer Vorhersagen hatte ich damit bisher auch noch keinen Datenverlust ;-)

Das Fazit also: Nimmt man ein (D)VCS als basis ist ein minimales Paketsystem nur sehr wenig Arbeit und leicht zu schreiben. Bis zu einem gewissen Grad kann man sich an der Verzeichnisstruktur als "Paketliste" orientieren und braucht ausser ein wenig Shell und einem symlink-Skript keine weiteren Hilfsmittel. Soll es aber komplexer werden (z.B. Reverse-Dependencies oder verschiedene Repo-Formate) wird man um Komplexe Loesungen wie eine Paketliste nicht herumkommen.