2013-06-11 4 views
16

Um meine Grunt-Aufgaben anzupassen, muss ich auf den Grunt-Task-Namen zugreifen, der beim Starten von grunt in der Befehlszeile angegeben wird.Wie bekommt man den Namen der Grunt-Aufgabe in der Kommandozeile?

Die Optionen sind kein Problem, da es gut dokumentiert ist (grunt.options). Es ist auch gut dokumentiert, wie Sie den Task-Namen beim Ausführen einer Grunt-Task herausfinden.

Aber ich brauche Zugriff auf den Namen der Aufgabe vor.

Eg der Benutzer schreibt grunt build --target=client

Wenn in meinem Gruntfile.js die Grunzen Job konfigurieren, kann ich grunt.option('target') verwenden 'client' zu bekommen.

Aber wie bekomme ich den Parameter build, bevor der Task Build startet?

Jede Anleitung wird sehr geschätzt!

Antwort

25

Ihre Grunt-Datei ist im Grunde nur eine Funktion. Versuchen Sie, diese Linie nach oben und fügte hinzu:

module.exports = function(grunt) { 
/*==> */ console.log(grunt.option('target')); 
/*==> */ console.log(grunt.cli.tasks); 

// Add your pre task code here... 

Laufen mit grunt build --target=client sollten Sie den Ausgang geben:

client 
[ 'build' ] 

An diesem Punkt können Sie einen beliebigen Code ausführen Sie müssen vor Ihrer Aufgabe ausgeführt wird, einschließlich der Einstellung Werte mit neuen Abhängigkeiten.

+0

Diese Antwort ist jetzt korrekt, nachdem sie bearbeitet wurde. Um den von der Befehlszeile angegebenen Tasknamen anzuzeigen, verwenden Sie: console.log (grunt.cli.tasks); Aufgaben ist ein Array – Zane

1

Sie können hierfür grunt.util.hooker.hook verwenden.

Beispiel (Teil Gruntfile.coffee):

grunt.util.hooker.hook grunt.task, (opt) -> 
    if grunt.task.current and grunt.task.current.nameArgs 
    console.log "Task to run: " + grunt.task.current.nameArgs 

CMD:

C:\some_dir>grunt concat --cmp my_cmp 
Task to run: concat 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
File "core.coffee" created. 

Done, without errors. 

Es gibt auch einen Hack, die ich verwendet habe, bestimmte Aufgabenausführung zu verhindern:

grunt.util.hooker.hook grunt.task, (opt) -> 
    if grunt.task.current and grunt.task.current.nameArgs 
    console.log "Task to run: " + grunt.task.current.nameArgs 
    if grunt.task.current.nameArgs is "<some task you don't want user to run>" 
     console.log "Ooooh, not <doing smth> today :(" 
     exit() # Not valid. Don't know how to exit :), but will stop grunt anyway 

CMD, wenn erlaubt:

C:\some_dir>grunt concat:coffee --cmp my_cmp 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
File "core.coffee" created. 

Done, without errors. 

CMD, wenn verhindert:

C:\some_dir>grunt concat:coffee --cmp my_cmp 
Running "concat:coffee" (concat) task 
Task to run: concat:coffee 
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue. 

Aborted due to warnings. 
2

Ein besserer Weg ist grunt.task.current zu verwenden, die Informationen über die aktuell laufende Aufgabe hat, ein name Eigentum. Innerhalb einer Aufgabe ist der Kontext (d. H. this) das gleiche Objekt. Damit . . .

grunt.registerTask('foo', 'Foobar all the things', function() { 
    console.log(grunt.task.current.name); // foo 
    console.log(this.name); // foo 
    console.log(this === grunt.task.current); // true 
}); 

Wenn build ist ein Alias ​​für andere Aufgaben und Sie wollen einfach nur wissen, was Befehl eingegeben wurde, das die aktuelle Aufgabenausführung geführt, ich process.argv[2] normalerweise verwenden.Wenn Sie process.argv untersuchen, sehen Sie, dass argv[0]node ist (weil grunt ist ein node Prozess), argv[1] ist grunt und argv[2] ist die eigentliche Aufgabe Grunzen (gefolgt von irgendwelchen params im Rest argv).

EDIT:

Beispiel Ausgang von console.log(grunt.task.current) auf [email protected] von innerhalb einer Aufgabe (kann nicht eine aktuelle Aufgabe hat, von einer nicht aktuellen Aufgabe).

{ 
    nameArgs: 'server:dev', 
    name: 'server', 
    args: [], 
    flags: {}, 
    async: [Function], 
    errorCount: [Getter], 
    requires: [Function], 
    requiresConfig: [Function], 
    options: [Function], 
    target: 'dev', 
    data: { options: { debugPort: 5858, cwd: 'server' } }, 
    files: [], 
    filesSrc: [Getter] 
} 
+0

'grunt.task.current' gab mir' undefined' mit Grunt 0.4.5. Welche Version verwendest du? – theUtherSide

+0

0.4.5. Machst du das innerhalb einer Aufgabe? Wenn nicht, dann ist "undefiniert" sinnvoll. Ich füge meine Ausgabe oben hinzu (zu unordentlich für einen Kommentar). – tandrewnichols

+0

Danke für die Klärung, ich war in 'module.exports = function (grunt) {...', aber außerhalb 'grunt.initConfig ...'. Es scheint, dass 'grunt.task.current' dort nicht verfügbar ist. – theUtherSide