Запуск команди в 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.
Натан

3
Чи є спосіб використовувати grunt-exec синхронно? Було б непогано з’єднати команди разом
funseiki

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 під node, тому для виклику команд терміналу вам потрібен модуль '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 я не впевнений, що це буде працювати на вікнах
svassr

Це не буде працювати, оскільки це скрипт bash. Я працюю під управлінням ОС Unix
JuanO

18

Якщо ви використовуєте останню версію grunt (0.4.0rc7 на момент написання цієї статті), і grunt-exec, і grunt-shell виходять з ладу (вони, здається, не оновлені для обробки останнього grunt). З іншого боку, виконуваний файл child_process є асинхронним, що є клопотом.

У підсумку я використав рішення Jake Trent і додав 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.5Windows
fiat

Я думаю, що використання shelljs - це чудове рішення, оскільки воно дозволяє вашій програмі вузла отримувати доступ до оболонки, і це дає вам більш точний контроль над нею, ніж лише додавання 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,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.