在gruntfile中执行shell脚本并将结果赋值给variables

我正在使用grunt来pipe理一套摩卡运行testing。 摩卡testing套件中需要的一件事情是设置某些环境variables,以便根据运行testing的开发人员的环境正确执行testing。 其中一个环境variables在每个开发人员的机器上都会有不同的值,所以我们执行一个bash脚本来为我们设置的环境variables返回这个值。

我正在使用grunt.util.spawn来运行脚本并将其结果分配给在gruntfile中定义的variables,然后使用grunt-env设置具有该值的环境variables。 下面是我的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运行,其中的callback似乎并没有得到执行,所以envvar永远不会被设置。 奇怪的是,如果我在我的testing中禁用日志logging,callback会被调用,但只有在我的env和simplemocha任务已经启动之后。 我对grunt任务的理解是,它们被阻塞了,所以我认为init任务必须在完成之后(即使是其中的asynchronous函数),然后再继续下一个任务。

有任何想法吗?

虽然我还不清楚上面的方法为什么不起作用,并且欢迎任何反馈,经过一些研究,我发现了shelljs ,我可以用它来解决我的问题。 由于shelljs可以同步执行shell命令,所以当我真的想阻止时,我不必使用callback函数:

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

更清洁!

参考文献: