Выполнить сценарий оболочки в gruntfile и присвоить результат переменной

Я использую grunt для управления набором тестов, запускаемых мокко. Одна из вещей, требуемых в наборе тестов mocha, заключается в том, что определенные переменные среды должны быть установлены так, чтобы тесты выполнялись должным образом в зависимости от среды разработчика, выполняющего тесты. Одна из этих переменных среды будет иметь различное значение на каждом компьютере разработчика, поэтому мы выполняем сценарий bash, чтобы вернуть это значение для переменной среды, которую мы устанавливаем.

Я использую grunt.util.spawn для запуска сценария и присвоения его результата переменной, определенной в моем файле grunt, а затем 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 были запущены. Мое понимание задач ворчания заключается в том, что они блокируются, поэтому я ожидаю, что задача инициализации должна быть завершена (даже с асинхронной функцией в ней), прежде чем перейти к следующей задаче.

Любые идеи?


person Clandestine    schedule 21.08.2013    source источник


Ответы (1)


Хотя я до сих пор не понимаю, почему описанный выше метод не работает, и приветствую любые отзывы, после небольшого исследования я нашел shelljs, который мне удалось использовать для решения моей проблемы. Поскольку shelljs может выполнять команды оболочки синхронно, мне не нужно работать с обратными вызовами, когда я действительно хочу, чтобы что-то заблокировалось:

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

И намного чище!

Использованная литература:

person Clandestine    schedule 22.08.2013
comment
В чем причина отрицательных голосов? Если есть что-то, что я могу сделать, чтобы сделать мой вопрос и ответ лучше, я бы с удовольствием! - person Clandestine; 22.08.2013