2013-02-13 2 views
16

Ho un task grunt che esamina le opzioni con grunt.option('foo'). Se sto chiamando questa attività da grunt.task.run('my-task'), come posso modificare tali argomenti?Imposta programmaticamente le opzioni per l'attività grunt?

Sto cercando qualcosa di simile:

grunt.task.run('my-task', {foo: 'bar'}); 

che sarebbe l'equivalente di:

$ grunt my-task --foo 'bar' 

è possibile?

(This question è un altro problema mi sono imbattuto in a, ma non è esattamente lo stesso, perché in questo caso non ho accesso al Gruntfile.js del compito originale.)

risposta

12

Sembra che posso utilizzare il seguente :

grunt.option('foo', 'bar'); 
grunt.task.run('my-task'); 

Ci si sente un po 'strano per impostare le opzioni a livello globale e non solo per quel comando, ma funziona.

+0

Non funzionerà se è necessario eseguire 2 o più attività:/se si dispone di un ciclo e si impostano 'grunt.option' e' grunt.task.run', entrambe le attività verranno eseguite con l'ultimo iterato di 'grunt .option'; @Rosarco, sapevi come risolverlo? –

+0

@RafaelVerger è possibile creare due attività, una che esegue l'attività e una che modifica l'opzione. Metti in coda le attività in ordine alternato e verranno eseguite con l'opzione impostata correttamente. – rosswil

+0

Funziona se si dispone di un insieme limitato di opzioni; ma quando si ottengono queste opzioni in modo dinamico (come l'interrogazione di un servizio di ricerca per server con MySQL) non funzionerà –

19

Se è possibile utilizzare basati su attività opzioni di configurazione, invece di grunt.option, questo dovrebbe funzionare per darvi un controllo più granulare:

grunt.config.set('task.options.foo', 'bar'); 
7

creare una nuova attività che ha fissato l'opzione, quindi chiamare il compito modificato . Questo è un esempio di vita reale con assemble:

grunt.registerTask('build_prod', 'Build with production options', function() { 
    grunt.config.set('assemble.options.production', true); 
    grunt.task.run('build'); 
}); 
+1

Questo è il modo corretto per ottenere la funzionalità desiderata. –

+0

Questa dovrebbe essere la risposta accettata –

3

Oltre a @Alessandro Pezzato

Gruntfile.js:

grunt.registerTask('build', ['clean:dist', 'assemble', 'compass:dist', 'cssmin', 'copy:main']); 

    grunt.registerTask('build-prod', 'Build with production options', function() { 
     grunt.config.set('assemble.options.production', true); 
     grunt.task.run('build'); 
    }); 

    grunt.registerTask('build-live', 'Build with production options', function() { 
     grunt.option('assemble.options.production', false); 
     grunt.task.run('build'); 
    }); 

Ora è possibile eseguire

$ grunt build-prod

-OR-

$ grunt build-live

Essi saranno entrambi eseguire il compito completo 'costruire' e rispettivamente passare un valore di uno dei options of assemble, cioè produzione 'vero' o 'falso'.


Oltre a illustrare l'esempio assemblare un po 'di più:

Nel montaggio si ha la possibilità di aggiungere un {{#if production}}do this on production{{else}}do this not non production{{/if}}

+0

Questa dovrebbe essere la risposta accettata. –

+0

Questo è fantastico. È inoltre possibile definire quali attività vengono eseguite nelle diverse opzioni passando l'elenco delle attività direttamente al comando di esecuzione (ad esempio, un altro comando build-dev che potrebbe saltare clean e cssmin): grunt.task.run (['clean: dist ',' assemblare ',' compass: dist ',' cssmin ',' copy: main ']); –

0

ho recentemente imbattuto contro questo stesso problema: l'impostazione di programmazione opzioni grugnito e eseguire attività più volte da una singola attività genitore. Come cita @Raphael Verger, questo non è possibile, come grunt.task.run rinvia l'esecuzione del compito fino a quando l'attività corrente è finita:

grunt.option('color', 'red'); 
grunt.task.run(['logColor']); 
grunt.option('color', 'blue'); 
grunt.task.run(['logColor']); 

comporterà il colore blu essere collegati due volte.

Dopo un po 'di manipolazione, ho trovato un task grunt che consente di specificare dinamicamente una diversa opzione/config per ogni sotto-attività da eseguire. Ho pubblicato l'attività come grunt-galvanize. Ecco come funziona:

var galvanizeConfig = [ 
    {options: {color: 'red'}, configs: {}}, 
    {options: {color: 'blue'}, configs: {}} 
]; 
grunt.option('galvanizeConfig', galvanizeConfig); 
grunt.task.run(['galvanize:log']); 

Questo registrerà rosso poi blu, come desiderato eseguendo il registro compito con ciascuna delle opzioni/configurazioni di cui galvanizeConfig.

1

grunt è tutto programmatico .. quindi se avete già impostato opzioni su attività, avete fatto questo programmaticamente.

basta usare grunt.initConfig({ ... }) per impostare le opzioni per le attività.

e se già inizializzato e necessario modificare la configurazione in seguito, si può fare qualcosa di simile

grunt.config.data.my_plugin.goal.options = {};

Io lo utilizzo per il mio progetto e funziona.