2013-08-21 31 views
7

Używam pomruków do zarządzania pakietem testów przeprowadzanych na mokro. Jedną z rzeczy wymaganych w pakiecie testowym mokka jest ustawienie pewnych zmiennych środowiskowych, aby testy były wykonywane poprawnie w oparciu o środowisko programisty przeprowadzającego testy. Jedna z tych zmiennych środowiskowych będzie miała inną wartość na każdym komputerze programisty, więc wykonamy skrypt bash, aby zwrócić tę wartość dla zmiennej środowiskowej, którą ustawiamy.Wykonywanie skryptu powłoki w pliku gruntów i przypisywanie wyniku do zmiennej

Używam polecenia grunt.util.spawn do uruchomienia skryptu i przypisania jego wyniku do zmiennej zdefiniowanej w moim pliku gruntowym, a następnie do pobrania zmiennej środowiskowej o tej wartości. Poniżej znajduje się przykład mojego gruntfile (w 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'] 

Aby to wykonać, wzywam ...

/path/to/grunt test 

Niestety, chociaż startowych tras, callback nich nie wydaje się, aby uzyskać wykonane, więc envvar nigdy nie zostanie ustawiony. Dziwnie, jeśli wyłączę logowanie w moich testach, wywołanie zwrotne zostanie wywołane, ale dopiero po uruchomieniu zadań env i simplemocha. Moje rozumienie zadań pomruczania jest takie, że są one blokowane, więc oczekiwałbym, że zadanie init będzie musiało zostać zakończone (nawet z zawartą w nim funkcją asynchroniczną) przed przejściem do następnego zadania.

Wszelkie pomysły?

Odpowiedz

10

Mimo że wciąż nie jestem pewien, dlaczego powyższa metoda nie działa, i po otrzymaniu informacji z zadowoleniem przyjmuję wszelkie opinie, które znalazłem shelljs, które mogłem wykorzystać do rozwiązania mojego problemu. Od shelljs może Exec powłokę poleceń synchronicznie, nie muszę pracować z callbacków kiedy naprawdę chcę rzeczy do bloku:

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

wiele czystsze, też!

Referencje:

+2

Jaki jest powód do głosowania w dół? Jeśli jest coś, co mogę zrobić, aby lepiej odpowiedzieć na moje pytanie i odpowiedź, bardzo bym chciał! – Clandestine