2013-06-11 13 views
16

Per personalizzare le mie attività di grunt, ho bisogno di accedere al nome del task grunt fornito sulla linea di comando quando si avvia il grunt.Come ottenere il nome del task grunt fornito sulla riga di comando?

Le opzioni non sono un problema, poiché sono ben documentate (grunt.options). È anche ben documentato come scoprire il nome dell'attività, quando si esegue un'attività grunt.

Ma prima ho bisogno di accedere al nome dell'attività.

Ad esempio, l'utente scrive grunt build --target=client

Quando si configura il lavoro grugnito nel mio Gruntfile.js, posso usare grunt.option('target') per ottenere 'client'.

Ma come si ottiene il parametro build prima dell'avvio della generazione dell'attività?

Qualsiasi consiglio è molto apprezzato!

risposta

25

Il tuo file grunt è fondamentalmente solo una funzione. Prova ad aggiungere questa riga verso l'alto:

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

// Add your pre task code here... 

Correndo con grunt build --target=client dovrebbe darvi l'output:

client 
[ 'build' ] 

A quel punto, è possibile eseguire qualsiasi codice che è necessario prima che il vostro compito è gestito compresa l'impostazione valori con nuove dipendenze.

+0

Questa risposta è corretta ora che è stata modificata. Per visualizzare il nome dell'attività fornito dalla riga di comando, utilizzare: console.log (grunt.cli.tasks); task è un array – Zane

1

Per questo è possibile utilizzare grunt.util.hooker.hook.

Esempio (parte di 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. 

C'è anche un hack che ho usato per prevenire certi esecuzione dell'attività:

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, se consentito:

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, quando ha impedito:

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

Un modo migliore è quello di utilizzare grunt.task.current che ha informazioni sul compito attualmente in esecuzione, tra cui una proprietà name. All'interno di un'attività, il contesto (ad esempio this) è lo stesso oggetto. Così . . .

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 
}); 

Se build è un alias ad altri compiti e si vuole solo sapere che cosa il comando è stato digitato che ha portato alla esecuzione dell'attività corrente, io di solito uso process.argv[2].Se si esamina process.argv, vedrai che è argv[0]node (perché grunt è un processo node), argv[1] è grunt, e argv[2] è il compito grugnito reale (seguita da eventuali params nel resto del argv).

EDIT:

Esempio di output da console.log(grunt.task.current) su [email protected] dall'interno di un'attività (non può avere un'attività corrente non è un compito corrente).

{ 
    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' mi ha dato' undefined' con grunt 0.4.5. Che versione stai usando? – theUtherSide

+0

0.4.5. Lo stai facendo da un compito? Perché se no, allora "indefinito" ha senso. Aggiungerò il mio output sopra (troppo disordinato per un commento). – tandrewnichols

+0

Grazie per aver chiarito, ero all'interno di 'module.exports = function (grunt) {...', ma all'esterno di 'grunt.initConfig ...'. Sembra che 'grunt.task.current' non sia disponibile lì. – theUtherSide

Problemi correlati