我正在使用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任务必须在完成下一个任务之前完成(即使使用其中的异步函数)。
有什么想法吗?
答案 0 :(得分:10)
虽然我仍然不清楚为什么上面的方法不起作用,并且欢迎任何反馈,经过一些研究后,我找到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']
也很干净!
参考文献: