gulp-sass,当无效的属性名称时停止观察

时间:2014-01-12 21:21:24

标签: node.js gulp

发生错误消息时,

监视会停止。

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 个答案:

答案 0 :(得分: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 options and configuration的更多信息

Gulp 2.x

在Gulp 2.x errLogToConsole中可能不再使用。幸运的是,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

答案 1 :(得分:11)

实际上,以上的避孕器对我不起作用(我正在使用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.x.x中我经常发现错误“this.emit('end');不是函数”。现在我正在使用:

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

一切都像魅力一样

答案 2 :(得分: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)

答案 3 :(得分:2)

为Gulp 3用户提供支持:

我喜欢上面的@dtotheftp解决方案,关于gulp 2.x.有趣的是,它不适用于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)

请注意,投诉不是来自gulpfile中的this.emit(),而是来自sass node-module,因此来自前一行。

这对我有用:

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

我确实收到了所有错误²,手表永远不会结束;)(我也在plumber()之后使用gulp.src(),这可能有助于此。)

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

-

²还有未定义的宏,无论出于何种原因,它在我的设置之前都是静默的。