当命令失败时,如何让gulp-exec打印到stdout?

时间:2015-07-01 16:33:47

标签: gulp

我使用以下代码启动了在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,所以不确定我在这里做错了什么。

2 个答案:

答案 0 :(得分:1)

gulp-exec假定该命令将返回0表示成功,非0表示失败,该失败意味着您希望构建失败。 (它应该在崩溃构建之前将stdoutstderr转储到控制台。)如果这些假设不成立,那么你可能更好地避免使用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来记录输出并绕过命令的返回!