在 gruntfile 中执行 shell 脚本并将结果分配给变量

Posted

技术标签:

【中文标题】在 gruntfile 中执行 shell 脚本并将结果分配给变量【英文标题】:Execute shell script in gruntfile and assign result to variable 【发布时间】:2013-08-24 11:35:40 【问题描述】:

我正在使用 grunt 来管理一套 mocha-run 测试。 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 任务必须完成(即使其中有异步函数)才能继续执行下一个任务。

有什么想法吗?

【问题讨论】:

【参考方案1】:

虽然我仍然不清楚上述方法为什么不起作用,并欢迎任何反馈,但经过一番研究,我找到了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/

【讨论】:

否决票的原因是什么?如果我能做些什么来让我的问题和答案变得更好,我很乐意!

以上是关于在 gruntfile 中执行 shell 脚本并将结果分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

利用shell脚本执行ssh远程另一台主机执行命令并返回命令的结果集

shell脚本中执行python脚本并接收其返回值的例子

为啥shell脚本中不能执行cd 命令

shell中怎么批量执行命令。

shell脚本中执行python脚本并接收其返回值的例子