簡體   English   中英

在gruntfile中執行shell腳本並將結果賦給變量

[英]Execute shell script in gruntfile and assign result to variable

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

也更干凈!

參考文獻:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM