2013-08-21 82 views
7

我正在使用grunt來管理一組mocha-run測試。摩卡測試套件中需要的一件事情是設置某些環境變量,以便測試根據運行測試的開發人員的環境正確執行。其中一個環境變量在每個開發人員的機器上都會有不同的值,所以我們執行一個bash腳本來爲我們設置的環境變量返回該值。在gruntfile中執行shell腳本並將結果賦值給變量

我正在使用grunt.util.spawn運行腳本並將其結果分配給我的gruntfile中定義的變量,然後使用grunt-env設置具有該值的環境變量。下面是我gruntfile(在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'] 

要執行此,我叫......

/path/to/grunt test 

不幸的是,雖然初始化運行,回調其中似乎並沒有得到執行,所以envvar永遠不會被設置。奇怪的是,如果我在我的測試中禁用日誌記錄,回調會被調用,但是隻有在我的env和simplemocha任務已經啓動之後。我對grunt任務的理解是,它們是阻塞的,所以我希望init任務必須完成(即使是其中的異步函數),然後才能轉到下一個任務。

任何想法?

回答

10

儘管我還不清楚上述方法爲什麼不起作用,並且歡迎任何反饋意見,但經過一些研究後,我發現shelljs,我可以用它來解決我的問題。由於shelljs可以Exec的殼同步命令,我沒有與回調在工作的時候我真的希望事情塊:

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

會更加清晰,太!

參考文獻:

+2

什麼是對倒票的原因嗎?如果有什麼我可以做的,使我的問題和答案更好,我很樂意! – Clandestine