Als Web­ent­wick­ler hat man nicht nur mit der Lösung komplexer Aufgaben, sondern auch mit der Be­wäl­ti­gung mühsamer, immer wieder auf­kom­men­der Prozesse zu kämpfen. So kosten Ar­beits­schrit­te wie das Kom­pi­lie­ren von Less- und SCSS- in CSS-Dateien nicht nur wertvolle Zeit, sondern auch jede Menge Nerven. Um dem ent­ge­gen­zu­wir­ken, wurden so­ge­nann­te Task-Runner ent­wi­ckelt, die solche Aufgaben au­to­ma­ti­sie­ren und die Ent­wick­ler entlasten. Ins­be­son­de­re für Ja­va­Script-Um­ge­bun­gen gibt es diverse An­wen­dun­gen, wobei Grunt und Gulp zu den po­pu­lärs­ten Ver­tre­tern zählen. Doch was macht die beiden Ja­va­Script-Task-Runner ei­gent­lich so besonders und wie un­ter­schei­den sie sich von­ein­an­der?

Was ist ein Task-Runner?

Bei einem Task-Runner (dt. „Aufgaben-Ausführer“) handelt es sich um ein Programm, das einen oder mehrere Com­pu­ter­pro­zes­se au­to­ma­ti­siert, die der Benutzer ansonsten manuell ausführen müsste. Ins­be­son­de­re bei Aufgaben, die es immer wieder und wieder zu erledigen gilt, ist diese Au­to­ma­ti­sie­rung von ent­spre­chend hohem Wert. Indem ein Task-Runner den Workflow optimiert, erspart er wertvolle Ar­beits­zeit, die man statt­des­sen in andere Auf­ga­ben­be­rei­che stecken kann. Die ver­schie­de­nen Lösungen un­ter­schei­den sich in erster Linie darin, wie sie pro­gram­miert werden und wie sie intern arbeiten. Dabei hat man als Nutzer immer die Kontrolle darüber, welche Ar­beits­schrit­te man von dem Tool ausführen lassen möchte und welche nicht.

In der Web­ent­wick­lung nehmen die prak­ti­schen Hilfs­werk­zeu­ge eine besonders wichtige Rolle ein: Frontend-Developer stehen täglich vor der Her­aus­for­de­rung, simple, aber re­gel­mä­ßig an­fal­len­de Prozesse wie die Kom­pi­lie­rung von Prä­pro­zes­sor-Style­sheets (Less, Sass, SCSS) in fertiges CSS oder die Mi­ni­fi­zie­rung des Ja­va­Script-Codes aus­zu­füh­ren. Auch das Testen der Funk­tio­na­li­tät der einzelnen Module nimmt häufig mehr Zeit in Anspruch, als ei­gent­lich zur Verfügung steht – Lösungen zur Ver­ein­fa­chung des Workflows sind fol­ge­rich­tig un­ver­zicht­bar. Durch­ge­setzt haben sich vor allem Ja­va­Script-Task-Runner, die auf eine Node.js-Grundlage aufbauen, um die je­wei­li­gen Prozesse zu au­to­ma­ti­sie­ren. Die Au­to­ma­ti­sie­rungs­mög­lich­kei­ten der einzelnen Programme lassen sich über zahl­rei­che Plugins erweitern.

Grunt vs. Gulp – zwei Ja­va­Script-Task-Runner im direkten Vergleich

Es exis­tie­ren ver­schie­de­ne Task-Runner für Ja­va­Script-Um­ge­bun­gen, die sich vor allem darin un­ter­schei­den, wie die Au­to­ma­ti­sie­rung eines Prozesses initiiert wird. Auf der einen Seite gibt es Programme, die bereits von Beginn an über den not­wen­di­gen Code für das Ausführen der ent­spre­chen­den Prozesse verfügen. Der Benutzer kon­fi­gu­riert in diesem Fall lediglich, welche Aufgaben er abgeben möchte, ohne sich direkt mit dem Pro­gramm­code aus­ein­an­der­zu­set­zen. Auf der anderen Seite stehen Ja­va­Script-Task-Runner, die die Pro­gram­mie­rung in den Vor­der­grund stellen und dem User dadurch we­sent­lich mehr Frei­hei­ten bei der Kreation eigener Au­to­ma­ti­sie­rungs-Skripte bieten.

Zu den be­kann­tes­ten An­wen­dun­gen zählen neben Broccoli.js und Brunch vor allem Gulp und Grunt. Um diese beiden und ihre Ge­mein­sam­kei­ten bzw. Un­ter­schie­de geht es im Folgenden.

Was ist Grunt?

2012 ver­öf­fent­lich­te der Ja­va­Script-Ent­wick­ler Ben Alman den Kom­man­do­zei­len-Task-Runner Grunt, den er seitdem mit einem kleinen Team betreut und wei­ter­ent­wi­ckelt. Der Code des Programms, das unter der freien MIT-Lizenz steht, kann auf der of­fi­zi­el­len Website her­un­ter­ge­la­den werden und steht zu­sätz­lich auf der Developer-Plattform GitHub zur freien Nutzung bereit. Grunt basiert wie alle ver­gleich­ba­ren Tools auf der Ja­va­Script-Lauf­zeit­um­ge­bung Node.js und verfügt mit grunt-cli über ein eigenes Kom­man­do­zei­len-Interface, das sich wie der Task-Runner selbst über den Pa­ket­ma­na­ger npm (Node Package Manager) in­stal­lie­ren lässt.

Um Grunt in ein Web­pro­jekt zu in­te­grie­ren, müssen dem Root-Ver­zeich­nis dieses Projekts zwei Dateien hin­zu­ge­fügt werden. Ty­pi­scher­wei­se enthält die Datei package.json alle re­le­van­ten Metadaten über die au­to­ma­ti­sier­ba­ren Tasks wie den Namen, die Version, die Lizenz oder die damit ver­bun­de­nen Ab­hän­gig­kei­ten. Im Gruntfile, das in validem Ja­va­Script (gruntfile.js) oder Cof­fee­Script (gruntfile.coffee) vorliegt, ist hingegen der ei­gent­li­che Code enthalten, über den die einzelnen Task-Module ein­ge­bun­den und kon­fi­gu­riert werden. Die Module, die auch als Plugins be­zeich­net werden, in­stal­liert man ebenfalls über die bereits erwähnte npm-Pa­ket­ver­wal­tung.

Das of­fi­zi­el­le Plugin-Ver­zeich­nis zählt weit über 6.000 ver­schie­de­ne Grunt-Tasks für die ver­schie­dens­ten Zwecke, z. B. grunt-contrib-clean (Aufräumen von Dateien und Ordnern), grunt-contrib-cssmin (CSS-Mi­ni­fi­zie­rung) oder grunt-contrib-connect (Starten eines lokalen Web­ser­vers). Viele dieser Plugins sind im Grunde genommen nichts anderes als Schnitt­stel­len zu ei­gen­stän­di­gen Tools. Bei­spiels­wei­se erlaubt es grunt-contrib-uglify, den Ja­va­Script-Mi­ni­fi­zie­rer UglifyJS vom Gruntfile aus zu steuern.

Hinweis

Die Plugin-Auf­lis­tung wird au­to­ma­tisch aus der npm-Mo­dul­da­ten­bank generiert. Bei Grunt-Plugins mit dem Zu­satz­la­bel „contrib“ handelt es sich um Er­wei­te­run­gen, die offiziell vom Ent­wick­ler-Team un­ter­stützt werden. Diese sind zu­sätz­lich durch ein Sternchen ge­kenn­zeich­net.

Neben der Mög­lich­keit, vor­han­de­ne Tasks zu mo­di­fi­zie­ren bzw. zu erweitern, können versierte Ent­wick­ler auch eigene Au­to­ma­ti­sie­rungs­mo­du­le kreieren, um den Task-Runner optimal an die eigenen Be­dürf­nis­se an­zu­pas­sen.

Was ist Gulp?

Im Juli 2013 brachte die ame­ri­ka­ni­sche Software-Firma Fractal In­no­va­tions in Zu­sam­men­ar­beit mit der GitHub-Community die erste Version des freien Task-Runners Gulp auf den Markt. Wie das zuvor erwähnte Grunt steht das Programm unter der Open-Source-MIT-Lizenz. Es basiert ebenso auf der Ja­va­Script-Plattform Node.js und greift wie sein Kon­kur­rent auf den Paket-Manager npm zurück. Auch hin­sicht­lich der Struktur un­ter­schei­den sich Grunt und Gulp kaum: Da Gulp ebenfalls ein Kom­man­do­zei­len-Tool ist, hat es mit gulp-cli eine passende Be­nut­zer­ober­flä­che. Hinzu kommen die in der Regel ver­wen­de­te Kon­fi­gu­ra­ti­ons­da­tei package.json und das Gulpfile (gulpfile.js), das die möglichen Tasks aufführt. Sind beide dem Web­ver­zeich­nis hin­zu­ge­fügt, kann der Task-Runner zur Workflow-Op­ti­mie­rung genutzt werden.

Das Gulpfile, das aus­schließ­lich Ja­va­Script enthält, fasst die einzelnen Da­tei­ope­ra­tio­nen zusammen, sodass diese über das Node.js-Modul stream aus­ge­führt werden können. Dabei laufen die einzelnen Stream-Prozesse größ­ten­teils im Ar­beits­spei­cher ab, bevor das Ergebnis am Ende wieder in die je­wei­li­gen Dateien ge­schrie­ben wird. Deshalb zeichnet sich der Task-Runner vor allem durch seine ex­zel­len­te Per­for­mance aus. Da die Tasks von Beginn an zwar pro­gram­miert, aber nicht kon­fi­gu­riert sind, sind Node.js- und Ja­va­Script-Know-how Grund­vor­aus­set­zung für die Nutzung von Gulp. Für Profis bedeutet dies eine Menge Frei­hei­ten, die aber auch mit einem erhöhten Feh­ler­po­ten­zi­al verbunden sind.

Auch für Gulp gibt es eine Menge vor­ge­fer­tig­ter Tasks in Plugin-Form. Im of­fi­zi­el­len Ver­zeich­nis auf gulpjs.com stehen über 3.000 ver­schie­de­ne Er­wei­te­run­gen wie gulp-jekyll (Kom­pi­lie­ren von Jekyll-Projekten), gulp-php-minify (Op­ti­mie­rung des PHP-Codes) oder gulp-css­myicons (Um­wand­lung von SVG-Icons in CSS).

Gulp vs. Grunt: Ge­mein­sam­kei­ten und Un­ter­schie­de im Überblick

Auf den ersten Blick scheinen Grunt und Gulp sich nicht we­sent­lich von­ein­an­der zu un­ter­schei­den: Beide Au­to­ma­ti­sie­rungs­tools stehen unter der MIT-Lizenz, weshalb der Quellcode offen und frei zur Verfügung steht. Beide An­wen­dun­gen sind über die Kom­man­do­zei­le steuerbar und verfügen zu diesem Zweck über ein eigenes Interface, das mit­in­stal­liert wird. Mit npm nutzen die Task-Runner außerdem auch den gleichen Paket-Manager. Dank ihrer großen Plugin-Ver­zeich­nis­se können sowohl Gulp als auch Grunt ohne großen Aufwand eine riesige Anzahl an Tasks au­to­ma­ti­sie­ren. Sollte es für den ge­wünsch­ten Prozess noch keine Er­wei­te­rung geben, kann diese mit jedem der beiden Tools selbst pro­gram­miert werden, wobei beide Task-Runner aufgrund ihrer Struktur Ja­va­Script- und Node.js-Kennt­nis­se erfordern.

Während Gulp jedoch in erster Linie auf das Node.js-Modul stream zu­rück­greift, nutzt Grunt vor allem das Modul fs (file system, dt. „Da­tei­sys­tem“), was einen der wich­tigs­ten Un­ter­schie­de beider Tools ver­deut­licht: Grunt ist strikt da­tei­ori­en­tiert und erzeugt im Zuge der aus­ge­führ­ten Aufgaben zunächst temporäre, lokale Dateien. Gulp hingegen wickelt die Prozesse über den Ar­beits­spei­cher ab und schreibt sofort in die Zieldatei, was dem Programm einen Ge­schwin­dig­keits­vor­teil ver­schafft.

Ein zweites Un­ter­schei­dungs­merk­mal ist das jeweilige Konzept der beiden Lösungen. Die Grunt-Pro­gram­mie­rung gibt Anwendern eine Richtung vor: Darin sind fertige Aufgaben bereits definiert und müssen lediglich kon­fi­gu­riert werden. Im Vergleich dazu räumt Gulp der ei­gen­stän­di­gen Pro­gram­mie­rung einen we­sent­lich größeren Platz ein, indem es lediglich die einzelnen Bausteine zur Verfügung stellt. Das ver­ein­facht es ei­ner­seits, die Hin­ter­grün­de und Zu­sam­men­hän­ge zu verstehen, verlangt Benutzern an­de­rer­seits aber auch mehr ab. Je größer ein Projekt ist, desto mehr kommen die Stärken von Gulp zum Tragen, weshalb der neue Task-Runner für viele mitt­ler­wei­le die erste Wahl darstellt. Dank der nied­ri­ge­ren Ein­stiegs­hür­de hat Grunt al­ler­dings bei kleineren, über­schau­ba­ren Projekten durchaus noch seine Da­seins­be­rech­ti­gung.

Ja­va­Script-Task-Runner: Grunt vs. Gulp in der ta­bel­la­ri­schen Ge­gen­über­stel­lung

  Grunt Gulp
Ver­öf­fent­li­chung 2012 2013
Website gruntjs.com gulpjs.com
Aus­führ­bar über Kom­man­do­zei­le Kom­man­do­zei­le
Basiert auf Node.js Node.js
Konzept Kon­fi­gu­ra­ti­on vor Pro­gram­mie­rung Pro­gram­mie­rung vor Kon­fi­gu­ra­ti­on
Pro­zess­aus­füh­rung lokal (temporäre Dateien) im Ar­beits­spei­cher
Format der Ba­sis­da­tei Ja­va­Script (De­kla­ra­tio­nen über­wie­gend im JSON-Stil) Ja­va­Script
Paket-Manager npm npm
Kom­man­do­zei­len-Interface grunt-cli gulp-cli
Plugins 6.000+ 3.000+
Zum Hauptmenü