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

94

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

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

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

Хуано
источник

Ответы:

105

В качестве альтернативы вы можете загрузить плагины 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
  }
}
бумага ковбой
источник
9
Кто-нибудь знает, можно ли использовать любой из этих двух вариантов в Windows?
Capaj
Я не мог сразу приступить grunt-shellк работе с Windows + Cygwin, но мне повезло больше grunt-exec.
Nathan
3
Есть ли способ синхронно использовать grunt-exec? Было бы неплохо
связать
1
@funseiki просто помещает команды в пакет или оболочку, которая вызывает команды в желаемом вами порядке. Или вы определяете задачу например mycmds и пишете, "exec:cmd1", "exec:cmd2"тогда у вас также есть синхронный заказ.
Себастьян
35

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

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});
Ник Хайнер
источник
5
с opts: {stdio: 'inherit'},вы можете увидеть результат команды
JuanPablo
2
Примечание: параметр cmd должен быть строкой, а не массивом.
RKI
1
Теперь для этого требуется grunt-legacy-utilплагин. require('child_process').spawn()Вместо этого рекомендуется использовать .
JD
19

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

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

Например,

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

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

Если вы используете последнюю версию 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');
});
кикито
источник
1
fyi grunt-shellотлично работает grunt v0.4.5под Windows
fiat
Я думаю, что использование shelljs - отличное решение, потому что оно позволяет вашему приложению node получать доступ к оболочке и дает вам более тонкий контроль над ним, чем одни только аддоны grunt.
Ник Стил,
14

Ребята указывают 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);
});
Артём Курапов
источник
Отличное решение без дополнительных плагинов.
valentinvieriu
Я пытался запускать текущие задачи в течение дня, и, наконец, простое решение, которое работает!
johnny 5