Запуск команды в Grunt Task

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

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

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




Ответы (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
  }
}
person papercowboy    schedule 01.11.2012
comment
Кто-нибудь знает, можно ли использовать любой из этих двух в Windows? - person Capaj; 25.04.2013
comment
Я не мог сразу заставить grunt-shell работать с Windows+Cygwin, но мне повезло больше с grunt-exec. - person Nathan; 10.03.2014
comment
Есть ли способ синхронно использовать grunt-exec? Было бы неплохо объединить команды в цепочку - person funseiki; 14.05.2014
comment
@funseiki просто помещает команды в пакет или оболочку, которая вызывает команды в предпочтительном для вас порядке. Или вы определяете задачу, например. mycmds и напишите "exec:cmd1", "exec:cmd2" тогда у вас тоже синхронно порядок. - person Sebastian; 12.08.2014

Проверьте grunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
person Nick Heiner    schedule 13.02.2013
comment
с opts: {stdio: 'inherit'}, вы можете увидеть вывод команды - person JuanPablo; 30.06.2014
comment
Примечание: параметр cmd должен быть строкой, а не массивом. - person RKI; 27.10.2015
comment
Теперь для этого требуется подключаемый модуль grunt-legacy-util. Вместо этого рекомендуется использовать require('child_process').spawn(). - person J.D.; 21.07.2016

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

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

Например,

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

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});
person JuanO    schedule 07.05.2012
comment
Лучший подход — использовать плагин (или написать свой собственный), чтобы сохранить конфигурацию grunt как конфигурацию, а не код. grunt-shell и grunt-exec — два примера. - person papercowboy; 02.11.2012
comment
Поскольку вы используете sh до sh mayCommand.sh , я не уверен, что это будет работать в Windows. - person svassr; 17.12.2013
comment
Это не сработает, потому что это bash-скрипт. Я работаю под ОС Unix - person JuanO; 17.12.2013

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

В итоге я использовал решение Джейка Трента и добавил shelljs как зависимость разработчика от моего проекта, чтобы я мог просто и синхронно запускать тесты:

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');
});
person kikito    schedule 03.02.2013
comment
к вашему сведению, grunt-shell отлично работает с grunt v0.4.5 под Windows - person fiat; 09.08.2015
comment
Я думаю, что использование shelljs — отличное решение, потому что оно позволяет вашему приложению узла получать доступ к оболочке и дает вам более точный контроль над ним, чем одни надстройки grunt. - person Nick Steele; 03.10.2015

Ребята указывают на 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);
});
person Artjom Kurapov    schedule 22.04.2015
comment
Отличное решение без дополнительных плагинов. - person valentinvieriu; 30.08.2016
comment
Я пытался запустить запущенные задачи в течение дня и, наконец, нашел простое решение, которое работает! - person johnny 5; 13.07.2018

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

person Daniel Steigerwald    schedule 10.03.2013