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.