Задайте задачу Gulp по умолчанию

У меня есть следующая задача в моей gulpFile, созданной кем-то еще в моей команде:

gulp.task('serve', [], function(){
   gulp.run(
    'fonts',
    'browsersync',
    'watch'
  );
});

Я хотел бы оставить его в покое, но я также хотел отобразить задачу по умолчанию для этой задачи. Поэтому я попробовал:

gulp.task('default',['serve']);

Казалось, что работает, поскольку сервер работает, но по какой-то причине задача "смотреть" не происходит, я не получаю обновление браузера при изменениях.

Все работает как запланировано, если я запустил "gulp serve", но не "gulp". Что я сделал не так?

EDIT: Здесь задача просмотра:

gulp.task('watch', ['styles', 'browsersync'], function() { //'default'
  gulp.watch(
    [
      './app/assets/sass/**/*.scss',
      './app/modules/**/*.scss'
    ], ['styles']);

  gulp.watch([
    './app/**/*.js',
    './app/**/*.html'
  ], function() {
    reload();
  });

});

Ответ 1

Попробуйте обновить задачу по умолчанию, чтобы включить задачу просмотра в аргумент массива вместо запуска внутри serve. Например:

gulp.task('default', ['serve', 'watch']);

Если вы закажете документацию Gulp по асинхронную поддержку задач, особенно последний пример, вы увидите, что вам может потребоваться зависимой задачи до завершения запланированной задачи.

var gulp = require('gulp');

// takes in a callback so the engine knows when it'll be done
gulp.task('one', function(cb) {
    // do stuff -- async or otherwise
    cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
});

// identifies a dependent task must be complete before this one begins
gulp.task('two', ['one'], function() {
    // task 'one' is done now
});

gulp.task('default', ['one', 'two']);

Ответ 2

gulp.run и gulp.start считаются плохой практикой:

https://github.com/gulpjs/gulp/issues/426
https://github.com/gulpjs/gulp/issues/505

К сожалению, ответ здесь, похоже, заключается в том, что ваш коллега, возможно, не совсем понимает Gulp. Возможно, вы не сможете исправить эту проблему, не изменяя свой код.

Без дополнительного контекста, как и весь файл gulpfile, я не могу воспроизвести вашу точную проблему. Однако я подозреваю, что это связано с тем, что Gulp выполняет задачи асинхронно/непрерывно. Возможно, ваша задача "по умолчанию" выходит преждевременно, потому что gulp.run не выполняется синхронно. Так или иначе, Gulp путают, какие задачи нужно ждать, когда. Вы используете два совершенно разных инструментария для управления вашей последовательностью выполнения.

Вместо gulp.run ваша задача "serve" должна действительно использовать зависимости для выполнения других задач:

gulp.task('serve', ['fonts', 'browsersync', 'watch']);
gulp.task('default', ['serve']);

Кроме того, стоит отметить, что ваша задача для часов уже перечисляет "browsersync" в качестве зависимости. Хотя это не технически некорректно (Gulp будет игнорировать его во второй раз), это может привести к чрезмерному усложнению и путанице, и, вероятно, это не очень хорошая идея. Если "смотреть" зависит от "browsersync" , вы можете просто удалить зависимость "browsersync" от "serve":

gulp.task('watch', ['styles', 'browsersync'], function () {
  gulp.watch([
    './app/assets/sass/**/*.scss',
    './app/modules/**/*.scss'
  ], ['styles']);

  gulp.watch([
    './app/**/*.js',
    './app/**/*.html'
  ], function() {
    reload();
  });
});
gulp.task('serve', ['fonts', 'watch']);
gulp.task('default', ['serve']);

Это даст вам результат, который вы ищете.


Если вы действительно настаиваете на неправильной практике, вы можете попробовать использовать gulp.run в своей задаче по умолчанию:

gulp.task('default', function() {
  gulp.run('serve');
});

Я подозреваю, что ваша основная проблема заключается в том, что вы смешиваете использование зависимостей задачи массива и gulp.run, но в любом случае gulp.run выполняет "неправильно".