Выполнение команды в задаче 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);
});
Ответ 6
Для команд async shell, работающих с Grunt 0.4.x, используйте https://github.com/rma4ok/grunt-bg-shell.