node.js – 在gruntfile中执行shell脚本并将结果赋给变量

我正在使用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']

也很清洁!

参考文献:

> How can I perform an asynchronous operation before grunt.initConfig()?
> http://jaketrent.com/post/impressions-of-grunt/

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...