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


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

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

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

6 89

6 ответов:

в качестве альтернативы вы можете загрузить в 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
  }
}

проверить grunt.util.spawn:

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

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

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

например,

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

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

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

Я в конечном итоге с помощью решение Джейка Трента, и добавив 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');
});

ребята указывают 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);
});

для асинхронных команд оболочки, работающих с Grunt 0.4.X использование https://github.com/rma4ok/grunt-bg-shell.