在 Grunt 任务中运行命令

Posted

技术标签:

【中文标题】在 Grunt 任务中运行命令【英文标题】:Running a command in a Grunt Task 【发布时间】:2012-05-14 11:20:19 【问题描述】:

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

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

我正在从命令行运行这个 jar,但我想将它设置为一个任务。

【问题讨论】:

【参考方案1】:

或者,您可以加载 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
  

【讨论】:

有谁知道这两个是否可以在 Windows 上使用? 我无法立即让 grunt-shell 与 Windows+Cygwin 一起工作,但我对 grunt-exec 的运气更好。 有没有办法同步使用 grunt-exec ?将命令链接在一起会很好 @funseiki 只是将命令放入批处理或外壳程序中,以您喜欢的顺序调用命令。或者您定义任务,例如mycmds 并写"exec:cmd1", "exec:cmd2" 然后你也有同步订单。【参考方案2】:

查看grunt.util.spawn:

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

【讨论】:

opts: stdio: 'inherit',可以看到命令的输出 注意:cmd 参数应该是字符串而不是数组。 现在需要grunt-legacy-util 插件。它建议改用require('child_process').spawn()【参考方案3】:

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

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

例如,

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

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

【讨论】:

更好的方法是使用插件(或自己编写)将 grunt 配置保留为配置而不是代码。 grunt-shell 和 grunt-exec 就是两个例子。 当你在sh mayCommand.sh 之前使用sh 我不确定它是否适用于Windows 它不起作用,因为它是 bash 脚本。我在 Unix 操作系统下运行【参考方案4】:

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

我最终使用了Jake Trent's solution,并将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');
);

【讨论】:

fyi grunt-shell 在 Windows 下与 grunt v0.4.5 正常工作 我认为使用 shelljs 是一个很好的解决方案,因为它使您的节点应用程序能够访问 shell,并且与单独的 grunt 插件相比,它可以让您更好地控制它。【参考方案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】:

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

【讨论】:

以上是关于在 Grunt 任务中运行命令的主要内容,如果未能解决你的问题,请参考以下文章

与'nodemon'和'watch'任务一起运行grunt-concurrent时的无限循环

在TypeScript中保存代码后是否可以运行grunt命令?

grunt

grunt服务没有在ubuntu中运行?

如何从jenkins运行npm / grunt命令

‘grunt‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件