[英]Execute shell script in gruntfile and assign result to variable
我正在使用grunt來管理一套摩卡運行測試。 mocha測試套件中需要的一件事是設置某些環境變量,以便根據運行測試的開發人員的環境正確執行測試。 其中一個環境變量在每個開發人員的機器上都有不同的值,因此我們執行一個bash腳本來為我們設置的環境變量返回該值。
我正在使用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
不幸的是,雖然init運行,但其中的回調似乎沒有被執行,因此envvar永遠不會被設置。 奇怪的是,如果我在我的測試中禁用了日志記錄,那么回調就會被調用,但只有在我的env和simplemocha任務被啟動后才會被調用。 我對grunt任務的理解是它們是阻塞的,所以我希望在繼續下一個任務之前必須完成init任務(即使使用其中的異步函數)。
有任何想法嗎?
雖然我仍然不清楚為什么上面的方法不起作用,並歡迎任何反饋,經過一些研究后,我找到了shelljs ,我能用它來解決我的問題。 由於shelljs可以同步執行shell命令,所以當我真的想要阻塞時,我不必使用回調:
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']
也更干凈!
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.