89

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

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

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

ответ

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-shell & grunt-exec - два примера. – papercowboy

+0

Поскольку вы используете '' 'sh''' перед' '' sh mayCommand.sh '' 'Я не уверен, что это будет работать на windows – svassr

+0

Это не сработает, потому что это bash-скриптинг. Я работаю под Unix OS – blackdragon

102

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

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 
    } 
} 
+8

Кто-нибудь знает, может ли любой из этих двух использоваться в Windows? – Capaj

+6

Для простых случаев оба отлично работали под Windows. – eddiegroves

+0

Я не мог сразу заставить 'grunt-shell' работать с Windows + Cygwin, но мне повезло с' grunt-exec'. – Nathan

18

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

Я закончил с использованием Jake Trent's solution и добавление 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'); 
}); 
+1

fyi 'grunt-shell' отлично работает с' grunt v0.4.5' под Windows – fiat

+0

Я думаю, что использование shelljs - отличное решение, потому что оно позволяет вашему узловому приложению получить доступ к оболочке, и это дает вам более тонкий контроль над ним, чем только хрюковые аддоны. –

34

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

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

с 'opts: {stdio: 'inherit'},' вы можете видеть вывод команды – JuanPablo

+1

. Примечание: cmd param должен быть строкой, а не массивом. – RKI

+0

Для этого теперь требуется плагин ['grunt-legacy-util'] (https://github.com/gruntjs/grunt-legacy-util). Вместо этого рекомендуется использовать ['require ('child_process') .spawn()'] (https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). –

11

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

Отличное решение без дополнительных плагинов. – valentinvieriu