Глоток: почему «jshint» не запускается при изменении файла?

#gulp

#глоток

Вопрос:

Вот соответствующие части моего gulpfile.js :

 var paths = {
  sass:    ['./www/**/*.scss'],
  scripts: ['./www/**/*.js', '!./www/lib/**/*.js']
};

gulp.task('jshint', function(done) {
  console.log('Running jshint');
  gulp.src(paths.scripts)
      .pipe(jshint())
      .pipe(jshint.reporter('default'))
      .on('end', done);
});

gulp.task('scripts', function(done) {
  console.log('Running scripts');
  gulp.src(paths.scripts)
      .pipe(concat('chessmate.js'))
      .pipe(gulp.dest('./www/'))
      .on('end', done);
});

gulp.task('sass', function(done) {
  gulp.src('./www/ionic.app.scss')
      .pipe(sass({
        errLogToConsole: true,
        includePaths: []
      }))
      .pipe(concat('chessmate.css'))
      .pipe(gulp.dest('./www/'))
      .on('end', done);
});

gulp.task('watch', function() {
  gulp.watch(paths.sass, ['sass']);
  gulp.watch(paths.scripts, ['jshint', 'scripts']);
});

gulp.task('default', ['jshint', 'scripts', 'sass', 'watch']);
  

Когда я запускаю gulp , запускаются оба jshint и scripts :

 [gulp] Using gulpfile /Users/mishamoroshko/ChessMate/gulpfile.js
[gulp] Starting 'jshint'...
Running jshint
[gulp] Starting 'scripts'...
Running scripts
[gulp] Starting 'sass'...
[gulp] Starting 'watch'...
[gulp] Finished 'watch' after 93 ms
  

Но, если затем я обновляю app.js , запускается только scripts :

 [gulp] Starting 'scripts'...
Running scripts
[gulp] Finished 'scripts' after 396 ms
  

Почему jshint не запускается?

Комментарии:

1. Возможно, если ваш первый jshint завершается с ошибкой подсказки (из-за плохого js), он не выдает ‘end’. Поскольку вы сигнализируете «сделано» только при завершении, gulp считает, что первая задача jshint все еще выполняется при последовательных изменениях, и будет ли nit запускать ее снова?

Ответ №1:

По-видимому, переходя от этого стиля:

 gulp.task('taskname', function(done) {
  [do stuff].on('end', done);
});
  

к этому одному:

 gulp.task('taskname', function() {
  return [do stuff];
});
  

решена проблема.

Ответ №2:

Мне кажется, что он должен запускаться автоматически, но поскольку это не так, вы могли бы попробовать добавить jshint задачу в качестве зависимости для scripts задачи следующим образом:

 gulp.task('scripts', ['jshint'], function(done) {
  console.log('Running scripts');
  gulp.src(paths.scripts)
      .pipe(concat('chessmate.js'))
      .pipe(gulp.dest('./www/'))
      .on('end', done);
});
  

Надеюсь, это поможет. Если это работает для вас, вы также должны иметь возможность удалить jshint из своей watch задачи:

 gulp.task('watch', function() {
  gulp.watch(paths.sass, ['sass']);
  gulp.watch(paths.scripts, [ /*'jshint',*/ 'scripts']);
});