Выполнение команды в задаче Grunt

Я использую Grunt (инструмент построения командной строки на основе задач для проектов JavaScript) в моем проекте. Я создал пользовательский тег, и мне интересно, можно ли запустить в него команду.

Чтобы уточнить, я пытаюсь использовать Closure Templates, и "задача" должна вызвать файл jar, чтобы предварительно скомпилировать файл Soy в файл javascript.

Я запускаю эту банку из командной строки, но я хочу установить ее как задачу.

Ответ 1

Я нашел решение, поэтому хотел бы поделиться с вами.

Я использую grunt в node, поэтому для вызова команд терминала вам потребуется модуль 'child_process'.

Например,

var myTerminal = require("child_process").exec,
    commandToBeExecuted = "sh myCommand.sh";

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});

Ответ 2

В качестве альтернативы вы можете загружать плагины grunt, чтобы помочь в этом:

grunt-shell пример:

shell: {
  make_directory: {
    command: 'mkdir test'
  }
}

или grunt-exec пример:

exec: {
  remove_logs: {
    command: 'rm -f *.log'
  },
  list_files: {
    command: 'ls -l **',
    stdout: true
  },
  echo_grunt_version: {
    command: function(grunt) { return 'echo ' + grunt.version; },
    stdout: true
  }
}

Ответ 3

Отъезд grunt.util.spawn:

grunt.util.spawn({
  cmd: ['rm'],
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});

Ответ 4

Если вы используете последнюю версию grunt (0.4.0rc7 на момент написания этой статьи), то и grunt-exec, и grunt-shell терпят неудачу (они, похоже, не обновляются для обработки последнего хрюка). С другой стороны, child_process exec является асинхронным, что является затруднением.

Я закончил использование решения Jake Trent и добавил shelljs как зависимость dev от моего чтобы я мог просто запускать тесты легко и синхронно:

var shell = require('shelljs');

...

grunt.registerTask('jquery', "download jquery bundle", function() {
  shell.exec('wget http://jqueryui.com/download/jquery-ui-1.7.3.custom.zip');
});

Ответ 5

Ребята указывают child_process, но попробуйте использовать execSync, чтобы увидеть результат.

grunt.registerTask('test', '', function () {
        var exec = require('child_process').execSync;
        var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' });
        grunt.log.writeln(result);
});