web-dev-qa-db-fra.com

gulp-sass, la montre s'arrête lorsque le nom de la propriété n'est pas valide

la montre s'arrête lorsque des messages d'erreur se produisent.

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

Comment garder la montre en marche et juste pour me dire où se trouve l'erreur.

grunt pourrait gérer les erreurs et n'a pas besoin de s'arrêter,

styleSheet.scss:41: error: invalid property name

sinon, je dois continuer à taper "gulp" dans la ligne de commande lorsqu'une erreur se produit.

40
olo

Cette réponse a été ajoutée pour refléter les modifications récentes apportées à Gulp. J'ai conservé la réponse originale, pour la pertinence de la question des PO. Si vous utilisez Gulp 2.x, passez à la deuxième section


Réponse originale, Gulp 1.x

Vous pouvez modifier ce comportement par défaut en passant errLogToConsole: true En option à la méthode sass().

Votre tâche pourrait ressembler à ceci, en ce moment:

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

Modifiez la ligne .pipe(sass()) pour inclure l'option errLogToConsole: true:

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

Voici à quoi devrait ressembler la tâche, avec la journalisation des erreurs:

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

La sortie des erreurs sera désormais en ligne, comme ceci:

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

Vous pouvez en savoir plus sur gulp-sass Options et configuration , sur nmpjs.org


Gulp 2.x

Dans Gulp 2.x errLogToConsole ne peut plus être utilisé. Heureusement, gulp-sass A une méthode pour gérer les erreurs. Utilisez on('error', sass.logError):

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

Si vous avez besoin d'un contrôle plus fin, n'hésitez pas à fournir une fonction de rappel:

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

C'est un bon fil à lire si vous avez besoin de plus d'informations sur le contrôle de processus: https://github.com/gulpjs/gulp/issues/259#issuecomment-55098512

83
chantastic

En fait, les réponses ci-dessus ne fonctionnent pas pour moi (j'utilise gulp-sass 3.XX). Ce qui a vraiment fonctionné:

 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))
});

Dans gulp-sass 3.x.x lorsque j'utilisais "sass.logError (err);" Je reçois constamment l'erreur que "this.emit ('end'); n'est pas une fonction". Maintenant, quand j'utilise:

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

tout fonctionne comme un charme

11
born2fr4g

Dans gulp "^ 2.0.0", l'option errLogToConsole ne fonctionnera plus. Au lieu de cela, gulp-sass A un rappel de journalisation des erreurs intégré qui utilise gulp-util Sous le capot. De plus, comme gulp a des problèmes pour tuer le processus en cas d'erreur, si vous utilisez avec watch, vous devrez appeler 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)
6
dtothefp

A avertit les utilisateurs de Gulp 3:

J'ai aimé la solution @dtotheftp ci-dessus, concernant gulp 2.x. Fait intéressant, cela ne fonctionne pas sous Gulp3, du moins pas sous @ 3.9.1:

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

me prend

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

Notez que la plainte ne vient pas de sa this.emit() dans le gulpfile mais plutôt du noeud-module sass, donc de la ligne précédente.

Cela fonctionne pour moi:

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

J'obtiens toutes les erreurs², et la montre ne se termine jamais;) (J'utilise également plumber() juste après gulp.src(), ce qui pourrait aider à cela).

(Oui, le correctif peut être très illogique, car sass.logError est basé sur gutil ...)

-

² également sur des macros non définies qui se sont tues auparavant sur ma configuration pour une raison quelconque.

2
Frank Nocke