Guard: automatisches Helferlein beim Schreiben

Gerade habe ich das Paket guard-docbook-status 0.2.0 online gestellt. Wer die Entwicklung von docbook_status mitverfolgt hat, weiß vielleicht dass es sich dabei um ein Zusatzpaket handelt, dass im Hintergrund Dateien auf Änderungen übewacht und dann automatisch passende Reaktionen auslöst. In unserem Fall wird docbook_status ausgeführt, und man bekommt sofort den neuen Status seines DocBook-Projekts angezeigt – ohne das Programm dafür aufgerufen zu haben. Man muss das Schreiben nicht unterbrechen, man muss den Editor nicht extra verlassen, sehr praktisch also.

guard-docbook-status ist nur ein sehr kleines Werkzeug. Die Hauptarbeit wird von Guard erledigt, einem Ruby-Werkzeug, das für diesen Zweck konzipiert wurde. Guards Zweck ist es, Dateisysteme zu überwachen, definierte Reaktionen auszulösen und Benachrichtigungen anzuzeigen. Es ist flexibel und kann daher in vielerlei Situationen bei der Hestellung von Texten, Medien, Code angewandt werden.

Guard stellt die allgemeinen Mechanismen bereit und eine Vielzahl von kleinen Zusatzmodulen passt es an einen bestimmten Einsatzzweck an: wie eben guard-docbook-status für docbook_status & DocBook. Eine erste Übersicht verfügbarer Module liefert die List of available Guards. Aber da gibt es noch mehr, man sollte also einfach nach guard- suchen, angefangen bei Github.

Wie so ein Guard-Modul funktioniert, lässt sich hier wohl am besten mit guard-docbook-status demonstrieren. Der Kern besteht aus einer Textdatei namens Guardfile, die man in seinem Arbeitsverzeichnis anlegen muss. Dort legt man fest, wann was passieren soll. Wenn man schon weiß, was man will, kann man die Datei selbst erstellen, ansonsten hilft einem Guard auch gern dabei. Der Befehl

$ guard init 

legt die Datei automatisch an, und füllt sie mit Vorlagen der installierten Zusatzmodule. Das sieht dann etwa so aus:

Writing new Guardfile to guard-test/Guardfile
docbook-status guard added to Guardfile, feel free to edit it 
minitest guard added to Guardfile, feel free to edit it 
rspec guard added to Guardfile, feel free to edit it ... 

Hat man viele Zusatzmodule installiert, wird die resultierende Datei schnell unübersichtlich. Daher sollte man in diesem Fall einfach sagen, was man möchte:

$ guard init docbook-status 
Writing new Guardfile to guard-test/Guardfile 
docbook-status guard added to Guardfile, feel free to edit it 

Der Inhalt von Guardfile sieht dann so aus:

# A sample Guardfile 
# More info at https://github.com/guard/guard#readme 

guard 'docbook-status', :cli => '--remarks myproject.xml' do 
   watch(/.+\.xml$/i) 
end

Der Inhalt besteht aus einer DSL (für den Zweck angepassten Ruby-Code), deren Syntax auf der Guardseite erklärt wird. Deren Umfang ist gering, man muss auch kein Ruby-Experte sein, um die Datei an seine eigenen Zwecke anzupassen. In Zeile 4 wird festegelegt, um welches Guard-Zusatzmodul es sich handelt und mit welchen Parametern es aufgerufen werden soll, wenn etwas passiert. In diesem Falle würde docbook_status die Datei myproject.xml auswerten, und dabei auch die enthaltenen Bemerkungen ausgeben (–remarks).

Möchte man die Datei für sich anpassen müsste man also nur den Dateinamen austauschen, myproject.xml.

Die Zeile 5 legt fest, wann Guard aktiv werden soll. Der Inhalt einer watch-Anweisung ist ein regelmäßiger Ausdruck für Dateinamen. In diesem Falle besagt sie, dass alle Dateien im Arbeitsverzeichnis mit Endung .xml beobachtet werden sollen. Wird eine dieser Dateien geändert, wird sofort docbook_status ausgeführt.

Diese Vorlage ist für DocBook-Projekte mit mehreren XML-Dateien konzipiert, die per XInclude o.ä. in die Hauptdatei integriert werden. Ändert man an irgendeiner Datei bekommt man sofort nach dem Speichern eine neue Statusanzeige. Hat man Dateien mit anderen Endungen, kann man die einfach hinzufügen.

Ist Guardfile fertig gestellt, ruft man einfach Guard in einem Terminal auf, und die Überwachung beginnt:

$ guard 
Guard is now watching at 'guard-test' 
Guard::DocbookStatus has started watching your files 
Guard::DocbookStatus detected a change docbook_status, Version 0.5.0 
... 

Die Überprüfung läuft solange, wie diese nicht durch die Eingabe von q abgebrochen wird.