Grunt-lagen, Teil 3

grunt-init ermöglicht das Initialisieren neuer Module. Dabei kopiert es nicht nur statische Dateien und Verzeichnisse, sondern kann sämtliche Dateien auch dynamisch erzeugen und verarbeiten.

vorlesen Druckansicht
Lesezeit: 3 Min.
Von
  • Golo Roden

Ein neues Modul zu beginnen bedeutet stets auch, zunächst eine gewisse Struktur von Verzeichnissen und Dateien einzurichten. Auch hierbei kann Grunt helfen, wie bereits beim regelmäßigen Ausführen der Codeanalyse und der Unit-Tests. Als Basis dient in diesem Fall das Modul grunt-init, das man allerdings gesondert von Grunt installieren muss. Dazu genügt der übliche Aufruf von npm, um ein Modul global zu installieren:

$ npm install -g grunt-init

AnschlieĂźend kann man grunt-init verwenden, um im aktuellen Verzeichnis ein neues Modul auf Basis einer vorhandenen Projektvorlage zu initialisieren. Dazu genĂĽgt es, die Anweisung

$ grunt-init <template>

auszuführen und den Namen der gewünschten Projektvorlage an Stelle des Platzhalter <template> anzugeben. grunt-init sucht diese Vorlage dann innerhalb des Verzeichnisses ~/.grunt-init/ und richtet das neue Modul wunschgemäß ein.

Da viele Entwickler ihre Projektvorlagen auf GitHub hosten, beschränkt sich die Installation einer neuen Projektvorlage in das lokale System in der Regel auf das Klonen des entsprechenden Repositories:

$ git clone git@github.com:<user>/<repository>.git ⏎
~/.grunt-init/<template>

Hinweis: Der Zeilenumbruch darf nicht eingegeben werden, er dient lediglich der Formatierung zur besseren Lesbarkeit.

Eine eigene Projektvorlage zu entwickeln, ist prinzipiell ein verhältnismäßig einfaches Unterfangen: Zunächst muss man ein Verzeichnis für die Projektvorlage anlegen. Im einfachsten Fall kann dieses bereits unterhalb von ~/.grunt-init/ liegen.

Innerhalb dieses Verzeichnisses muss man zwei Dateien und ein weiteres Verzeichnis erzeugen:

  • Die Datei template.js enthält sämtlichen Code, der die Projektvorlage initialisiert. Je nach Bedarf kann man in dieser Datei eine beliebig komplexe Logik abbilden.
  • Die Datei rename.json enthält eine Liste aller Dateien, deren Dateiname dynamisch zu erzeugen ist, um beispielsweise den Namen des Moduls abzubilden.
  • Das Verzeichnis root enthält schlieĂźlich alle zu kopierenden Dateien und Verzeichnisse.

Die denkbar einfachste Variante der Datei template.js erfragt lediglich den Namen und die Beschreibung des zu initialisierenden Moduls und startet anschlieĂźend den Kopiervorgang. Dazu genĂĽgen die folgenden wenigen Codezeilen:

'use strict';

module.exports.template = function (grunt, init, done) {
init.process({}, [
init.prompt('name'),
init.prompt('description')
], function (err, properties) {
var files = init.filesToCopy(properties);
init.copyAndProcess(files, properties);
done();
});
};

Die mit der Funktion init.prompt erfragten Werte stehen anschließend in der Datei rename.json als Variablen zur Verfügung. Auf diese Weise ist es beispielsweise möglich, der Datei, die den Einstiegspunkt in das Modul enthält, und der dazugehörigen Testdatei einen modulspezifischen Namen zu geben:

{
"lib/app.js": "lib/{%= name %}.js",
"test/appTests.js": "test/{%= name %}Tests.js"
}

Dem Verzeichnisses root sind danach alle Dateien und Verzeichnisse hinzuzufĂĽgen, mit denen grunt-init ein neues Modul initialisieren soll. Um welche konkreten Dateien und Verzeichnisse es sich dabei handelt und welcher Struktur diese folgen, obliegt der WillkĂĽr des Entwicklers.

Auch innerhalb all dieser Dateien stehen die von der Funktion init.prompt erfragten Werte als Variablen zur VerfĂĽgung, um beispielsweise die Dateien package.json und README.md dynamisch zu erzeugen.

tl;dr: grunt-init ermöglicht das Initialisieren neuer Module. Dabei kopiert es nicht nur statische Dateien und Verzeichnisse, sondern kann sämtliche Dateien auch dynamisch erzeugen und verarbeiten. ()