我正在使用 grunt 来管理一套 mocha-run 测试。mocha 测试套件中要求的一件事是设置某些环境变量,以便根据运行测试的开发人员的环境正确执行测试。其中一个环境变量在每个开发人员的机器上都有不同的值,因此我们执行一个 bash 脚本来为我们正在设置的环境变量返回该值。
我正在使用 grunt.util.spawn 运行脚本并将其结果分配给我的 gruntfile 中定义的变量,然后 grunt-env 使用该值设置环境变量。下面是我的 gruntfile 示例(在咖啡脚本中):
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 任务必须完成(即使其中有异步函数)才能继续执行下一个任务。
有任何想法吗?