2013-08-21 9 views
7

Ich verwende grunt, um eine Reihe von Mocha-Run-Tests zu verwalten. Eines der Dinge, die in der Mokka-Testsuite erforderlich sind, besteht darin, dass bestimmte Umgebungsvariablen so festgelegt werden, dass die Tests basierend auf der Umgebung des Entwicklers, der die Tests ausführt, ordnungsgemäß ausgeführt werden. Eine dieser Umgebungsvariablen hat auf jedem Entwicklungscomputer einen anderen Wert. Daher führen wir ein Bash-Skript aus, um diesen Wert für die von uns eingestellte Umgebungsvariable zurückzugeben.Shell-Skript in gruntfile ausführen und Ergebnis der Variablen zuweisen

Ich verwende grunt.util.spawn, um das Skript auszuführen und sein Ergebnis einer Variablen zuzuordnen, die in meiner Gruntdatei definiert ist, und grunt-env, um die Umgebungsvariable mit diesem Wert festzulegen. Im Folgenden ist ein Beispiel für meine 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'] 

dies auszuführen, rufe ich ...

/path/to/grunt test 

Leider obwohl init läuft, darin der Rückruf nicht zu bekommen scheint ausgeführt, also wird envvar nie gesetzt. Seltsamerweise, wenn ich die Anmeldung in meinen Tests deaktiviere, wird der Callback aufgerufen, aber erst nachdem meine env und simplemocha Tasks gestartet wurden. Ich verstehe Grunt Tasks so, dass sie blockieren, also würde ich erwarten, dass die Init-Aufgabe abgeschlossen sein muss (sogar mit der Async-Funktion darin), bevor ich mit der nächsten Aufgabe fortfahre.

Irgendwelche Ideen?

Antwort

10

Obwohl ich immer noch unklar bin, warum die obige Methode nicht funktioniert, und begrüßen jede Rückmeldung, nach ein wenig Forschung, fand ich shelljs, die ich verwenden konnte, um mein Problem zu lösen. Da shelljs synchron Shell-Befehle exec, muss ich nicht mit Rückrufe arbeiten, wenn ich zu Block wirklich Dinge wollen:

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'] 

viel sauberer, auch!

Referenzen:

+2

Was ist der Grund für die nach unten Stimmen? Wenn ich etwas tun kann, um meine Frage und Antwort besser zu stellen, würde ich gerne! – Clandestine

Verwandte Themen