2013-08-21 11 views
7

Sto utilizzando grunt per gestire una suite di test eseguiti da mocha. Una delle cose necessarie nella suite di test mocha è che determinate variabili d'ambiente siano impostate in modo che i test siano eseguiti correttamente in base all'ambiente dello sviluppatore che esegue i test. Una di queste variabili d'ambiente avrà un valore diverso sulla macchina di ogni sviluppatore, quindi eseguiamo uno script bash per restituire quel valore per la variabile d'ambiente che stiamo impostando.Esegui lo script di shell in gruntfile e assegna il risultato alla variabile

Sto usando grunt.util.spawn per eseguire lo script e assegnare il suo risultato a una variabile definita nel mio gruntfile, quindi grunt-env per impostare la variabile di ambiente con quel valore. Di seguito è riportato un esempio del mio gruntfile (in CoffeeScript):

module.exports = (grunt) -> 
    envvar = '' 

    grunt.initConfig 
    pkg: grunt.file.readJSON('package.json') 

    env: 
     dev: 
     ENV_VAR: envvar 

    simplemocha: 
     options: 
     timeout: 30000 
     reporter: 'spec' 
     compilers: 'coffee:coffee-script' 
     all: 
     src: ['Tests/**/*.coffee'] 

    grunt.registerTask 'init', -> 
    done = this.async 
    command = 
     cmd: './bin/get_envvar.sh' 
    grunt.util.spawn command, (error, result, code) -> 
     envvar = result 
     console.log 'envvar: ' + envvar 
     done 

    grunt.registerTask 'test', ['init', 'env', 'simplemocha'] 

Per eseguire questo, mi chiamano ...

/path/to/grunt test 

Purtroppo, anche se corre init, la richiamata in essa non sembra per ottenere eseguito, quindi envvar non viene mai impostato. Stranamente, se disabilito l'accesso ai miei test, viene richiamato il callback, ma solo dopo che le mie attività env e simplemocha sono state avviate. La mia comprensione dei task grunt è che stanno bloccando, quindi mi aspetto che l'attività di init debba essere completata (anche con la funzione async) prima di passare all'attività successiva.

Qualche idea?

risposta

10

Anche se non sono ancora chiaro perché il metodo sopra non funziona, e gradito qualsiasi feedback, dopo un po 'di ricerca, ho trovato shelljs, che sono stato in grado di utilizzare per risolvere il mio problema. Dal momento che shelljs può exec della shell comandi in modo sincrono, non ho di lavorare con callback quando voglio veramente cose da blocco:

module.exports = (grunt) -> 
    shell = require 'shelljs' 
    envvar = shell.exec('./bin/get_envvar.sh', {'silent':true}).output 

    grunt.initConfig 
    pkg: grunt.file.readJSON('package.json') 

    env: 
     dev: 
     ENV_VAR: envvar 

    simplemocha: 
     options: 
     timeout: 30000 
     reporter: 'spec' 
     compilers: 'coffee:coffee-script' 
     all: 
     src: ['Tests/**/*.coffee'] 

    grunt.registerTask 'test', ['env', 'simplemocha'] 

molto più pulito, anche!

Riferimenti:

+2

Qual è la ragione per i voti verso il basso? Se c'è qualcosa che posso fare per rendere la mia domanda e risposta meglio, mi piacerebbe! – Clandestine