在Grunt任务中运行命令

时间:2012-05-04 22:20:38

标签: javascript templates gruntjs continuous-integration google-closure-compiler

我在项目中使用Grunt(基于任务的JavaScript项目命令行构建工具)。我已经创建了一个自定义标签,我想知道是否可以在其中运行命令。

为了澄清,我正在尝试使用Closure模板,“任务”应该调用jar文件将Soy文件预编译为javascript文件。

我正在从命令行运行此jar,但我想将其设置为任务。

6 个答案:

答案 0 :(得分:103)

或者你可以加载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
  }
}

答案 1 :(得分:34)

结帐grunt.util.spawn

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

答案 2 :(得分:19)

我找到了解决方案,所以我想与您分享。

我在节点下使用grunt,所以要调用终端命令,你需要'child_process'模块。

例如,

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

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});

答案 3 :(得分:18)

如果您使用的是最新的grunt版本(撰写本文时为0.4.0rc7),grunt-exec和grunt-shell都会失败(它们似乎不会更新以处理最新的grunt)。另一方面,child_process的exec是异步的,这很麻烦。

我最终使用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');
});

答案 4 :(得分: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);
});

答案 5 :(得分:2)

对于使用Grunt 0.4.x的异步shell命令,请使用https://github.com/rma4ok/grunt-bg-shell