在Grunt任务中运行命令


94

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

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

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

Answers:


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 2014年

1
@funseiki只是将命令放入批处理或shell中,以您喜欢的顺序调用这些命令。或者您定义任务(例如mycmds)并编写,"exec:cmd1", "exec:cmd2"那么您也将具有同步顺序。
塞巴斯蒂安2014年


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 config保留为config而不是代码。grunt-shell和grunt-exec是两个示例。
papercowboy 2012年

如您sh之前所用,sh mayCommand.sh 我不确定它是否可以在Windows上使用
svassr 2013年

它不会工作,因为它是bash脚本。我在Unix操作系统下运行
JuanO 2013年

18

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

我最终使用了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 在Windows下grunt-shell可以正常工作grunt v0.4.5
菲亚特(

我认为使用shelljs是一个很好的解决方案,因为它使您的节点应用程序可以访问shell,并且比单独的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

我一直在尝试运行一天的运行任务,最后是一个可行的简单解决方案!
约翰尼

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.