在 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');
);
【讨论】:
fyigrunt-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时的无限循环