41

出现错误消息时手表停止。

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
source string:51: error: invalid property name 

我如何保持手表运行,并告诉我错误在哪里。

grunt 可以处理错误并且不需要停止,

styleSheet.scss:41: error: invalid property name

否则,当发生错误时,我需要在命令行中继续输入“gulp”。

4

4 回答 4

83

已附加此答案以反映 Gulp 的最新更改。为了与 OPs 问题相关,我保留了原始回复。如果您使用的是 Gulp 2.x,请跳到第二部分


原始响应,Gulp 1.x

您可以通过errLogToConsole: true作为选项传递给sass()方法来更改此默认行为。

现在,您的任务可能看起来像这样:

gulp.task('sass', function () {
  gulp.src('./*.scss')
    .pipe(sass())
    .pipe(gulp.dest('./'));
});

更改该.pipe(sass())行以包含该errLogToConsole: true选项:

.pipe(sass({errLogToConsole: true}))

这就是带有错误日志记录的任务应该如下所示:

gulp.task('sass', function () {
  gulp.src('./*.scss')
    .pipe(sass({errLogToConsole: true}))
    .pipe(gulp.dest('./'));
});

错误输出现在将是内联的,如下所示:

[gulp] [gulp-sass] source string:1: error: invalid top-level expression

您可以在 nmpjs.org 上阅读有关gulp-sass选项和配置的更多信息


吞咽 2.x

在 Gulp 2.xerrLogToConsole中可能不再使用。幸运的是,gulp-sass有一种处理错误的方法。使用on('error', sass.logError)

gulp.task('sass', function () {
  gulp.src('./sass/**/*.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('./css'));
});

如果您需要更细粒度的控制,请随时提供回调函数:

gulp.task('sass', function () {
  gulp.src('./sass/**/*.scss')
    .pipe(sass()
      .on('error', function (err) {
        sass.logError(err);
        this.emit('end');
      })
    )
    .pipe(gulp.dest('./css'));
});

如果您需要有关过程控制的更多信息,这是一个很好的阅读主题:https ://github.com/gulpjs/gulp/issues/259#issuecomment-55098512

于 2014-01-20T21:36:06.370 回答
11

实际上上面的 anwsers 对我不起作用(我使用 gulp-sass 3.XX)。真正起作用的是:

 gulp.task('sass', function () {
    return gulp.src(config.scssPath + '/styles.scss')
        .pipe(sourcemaps.init())
        .pipe(sass({ outputStyle: 'compressed' })
            .on('error', sass.logError)
        )
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest(config.cssPath))
});

当我使用“sass.logError(err);”时,在 gulp-sass 3.xx 中 我经常收到“this.emit('end'); 不是函数”的错误。现在当我使用:

.pipe(sass({ outputStyle: 'compressed' })
    .on('error', sass.logError)
 )

一切都像魅力一样运作

于 2015-11-20T14:45:51.700 回答
6

在 gulp "^2.0.0" 中,该选项errLogToConsole将不再起作用。取而代之gulp-sass的是一个内置的错误日志回调,gulp-util在后台使用。此外,由于 gulp 在终止错误进程方面存在一些问题,如果您正在使用,watch则必须致电this.emit('end') https://github.com/gulpjs/gulp/issues/259#issuecomment-55098512

var sass = require('gulp-sass');

//dev
sass(config.sassDev)
  .on('error', function(err) {
     sass.logError(err);
       this.emit('end'); //continue the process in dev
     })
)

//prod
sass(config.sassProd).on('error', sass.logError)
于 2015-06-09T20:17:34.693 回答
2

Gulp 3 用户注意事项:

关于 gulp 2.x,我喜欢上面的 @dtotheftp 解决方案。有趣的是,它在 Gulp3 下不起作用,至少在 @3.9.1 下不起作用:

.on('error', function(err){
    sass.logError(err);
    this.emit('end'); //continue the process in dev
})

得到我

TypeError: this.emit is not a function
    at Function.logError (/depot/myproject/node_modules/gulp-sass/index.js:181:8)

请注意,投诉不是来自this.emit()gulpfile 中的他,而是来自 sass 节点模块,因此来自前一行。

这对我有用:

.on('error', function(err){
    gutil.log(err);
    this.emit('end');
})

我确实得到了所有错误²,并且手表永远不会结束;)(我也在使用plumber()gulp.src()这可能会有所帮助)。

(是的,修复可能非常不合逻辑,因为据说 sass.logError 是基于gutil ...)

——</p>

²还有未定义的宏,无论出于何种原因,这些宏在我的设置之前都保持沉默。

于 2016-12-18T11:09:26.820 回答