我使用以下代码启动了在Windows 8上运行的gulp进程:
gulp.src('test.bat')
.pipe($.exec('test.bat <%= file.path %>'))
.pipe($.exec.reporter());
当前文件夹中的批处理文件包含以下内容:
@echo off
echo This is a test to stdout
echo The script was passed %*
exit 0
输出如下:
[11:27:40] This is a test to stdout
The script was passed C:\temp\test.bat
如果批处理文件返回-1,则输出如下:
events.js:85
throw er; // Unhandled 'error' event
^
Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "test.bat C:\temp\test.bat"
at ChildProcess.exithandler (child_process.js:751:12)
at ChildProcess.emit (events.js:110:17)
at maybeClose (child_process.js:1015:16)
at Socket.<anonymous> (child_process.js:1183:11)
at Socket.emit (events.js:107:17)
at Pipe.close (net.js:485:12)
如何让gulp.exec()首先从脚本中打印标准输出,然后更优雅地失败?来自events.js的错误不是我应该看到的,而是一些关于命令失败的优雅错误消息。根据文档,所有默认选项应该已经设置为输出stdout和stderr,所以不确定我在这里做错了什么。
答案 0 :(得分:1)
gulp-exec
假定该命令将返回0表示成功,非0表示失败,该失败意味着您希望构建失败。 (它应该在崩溃构建之前将stdout
和stderr
转储到控制台。)如果这些假设不成立,那么你可能更好地避免使用gulp-exec而是这样做:
var through2 = require('through2');
var exec = require('child_process').exec;
gulp.task('sometask', function() {
return gulp.src('**/*.js')
.pipe(through2.obj(function (file, enc, cb) {
var that = this;
exec('test.bat some args here', function (err, stdout, stderr) {
// take appropriate action then
that.push(file);
cb(null);
});
})
.pipe(gulp.dest('dist'));
});
答案 1 :(得分:0)
我遇到了同样的问题,我可以采用以下方法解决问题:
gulp.src('test.bat')
.pipe($.exec('test.bat <%= file.path %>', function cb(err, stdout, stderr) {
console.log(stdout); // outputs the normal messages
console.log(stderr); // outputs the error messages
return 0; // makes gulp continue even if the command failed
}))
.pipe($.exec.reporter());
这里棘手的部分是exec
提供了一个回调函数($.exec(command, callback)
),我们可以通过简单地返回0
来记录输出并绕过命令的返回!