Wil je graag specifieke acties uitvoeren als bestanden in een map aangepast worden, dan kun je daarvoor een Makefile aanmaken en telkens de opdracht make intypen als de bestanden weer eens aangepast zijn. Maar waarom zou dat niet automatisch kunnen? De Linux-kernel heeft daarvoor het inotify-subsysteem, recente FreeBSD- en OpenBSD-versies hebben kqueue, OS X heeft FSEvents en in Solaris en illumos is hetzelfde mogelijk met port_create. 

Nu heeft een ontwikkelaar van Facebook een programma onder de Apache 2.0-licentie uitgebracht dat op al die systemen werkt, genaamd Watchman. Het biedt een eenvoudige commandline-interface aan om automatisch te luisteren naar veranderingen in bestanden en indien gewenst na die veranderingen acties uit te voeren.

 Het programma is nog te jong om in de standaard repository’s van de bekende Linux-distributies aanwezig te zijn, maar de broncode is vrij eenvoudig te compileren:

$ git clone https://github.com/facebook/watchman.git

$ cd watchman

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install

 

Installeer daarvoor eerst Git, automake, autoconf en nog enkele andere ontwikkeltools. Onder Debian of Ubuntu gaat dat met sudo apt-get install build-essential.

Je laat Watchman naar een directory luisteren met de volgende opdracht:

 $ watchman watch $DIRECTORY

 Na een tijdje krijg je een JSON-code te zien met de versie van Watchman en het pad van de directory. Daarna kun je een trigger opstellen op bestanden in die directory. Gaat het bijvoorbeeld om CSS-bestanden die je wilt verkleinen, dan gebruik je het volgende commando:

$ watchman — trigger $DIRECTORY minify ‘*.css’ — minify-css

Hierin is minify de naam die je aan de trigger geeft. Daarna komt het patroon waaraan de bestandsnamen moeten voldoen. Het uiteindelijke commando dat op de bestanden uitgevoerd wordt, komt op het laatst, hier het programma minify-css.

Met watchman watch-list krijg je een lijst van alle directory’s waarnaar Watchman luistert en met watchman watch-del $DIRECTORY verwijder je een directory uit de lijst. Met watchman trigger-list $DIRECTORY vraag je alle triggers op die aan een directory verbonden zijn en met watchman trigger-del $DIRECTORY $TRIGGERNAME verwijder je een trigger.

Bekijk zeker ook de website van het project, waar meer uitleg bij alle subcommando’s te vinden is. En tot slot een belangrijke opmerking: Watchman werkt niet op bestandssystemen over een netwerk of gedistribueerde bestandssystemen, want het programma hangt af van de file notifications van het besturingssysteem. https://facebook.github.io/watchman/