Конвейер задач Gulp для объединения только в том случае, если исходный файл (ы) изменился

У меня есть задача gulp, которая генерирует конкатенированные файлы JS. Я использую часы для обнаружения изменений во всех файлах в проекте и хотел бы, чтобы задача concat повторно объединяла файлы только в том случае, если исходные файлы изменились с момента последнего выполнения.

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

Что-то вроде этого:

gulp.task('scripts', function() {
   return gulp.src('src/**/*.js')
      .pipe(cache('scripts'))
      // If no changed files in pipeline, exit pipeline, 
      // else add in all src files again
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build/'));
});

Я думал об использовании lazypipe для последних двух шагов, поэтому я запускаю concat и dest только в том случае, если есть файлы, но я не знаю, как это сделать:

  • Запустите условие, основанное на том, остались ли какие-либо файлы в конвейере (после cache()
  • Верните все исходные файлы (по сути, снова перевыпустите gulp.src(), чтобы перезапустить поток)

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

Кто-нибудь делал это раньше или есть какие-либо намеки, с чего начать?


person Allen    schedule 16.07.2014    source источник
comment
Вы смотрели gulp-changed?   -  person Josh Clayton    schedule 17.07.2014
comment
@JoshClayton Я сделал checkout gulp-changed, и похоже, что в отношении этой проблемы он будет вести себя так же, как gulp-cached. (т.е. он будет проходить только через входные файлы в потоке, которые действительно необходимо обработать). Я не вижу, чтобы это решило проблему с выходом или повторным добавлением всех файлов src.   -  person Allen    schedule 17.07.2014


Ответы (3)


Код в ответе moettinger (на момент написания) неверен. Вот поток для возврата:

return gulp.src('src/**/*.js')
   .pipe(newer('build/app.js'))
   .pipe(concat('app.js'))
   .pipe(gulp.dest('build/'));

При тестировании с одним пунктом назначения вызов newer() должен передавать путь, который относится к текущему каталогу (или абсолютный путь). Это не может быть путь, который следует интерпретировать в сравнении с путем, указанным в gulp.dest(). С вызовом newer('app.js') вызов newer всегда будет вызывать выполнение concat, потому что он не найдет файл.

документация дает аналогичную пример.

person Louis    schedule 01.10.2015

Плагин gulp-newer должен помочь.

   gulp.task('scripts', function() {
   return gulp.src('src/**/*.js')
      .pipe(newer('app.js'))
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build/'));
});
person moettinger    schedule 28.07.2014

Хотя это старый вопрос, я подумал, что просто добавлю информацию о gulp-new. Gulp-newer обнаруживает изменения на основе метки времени файлов, если файл удален, gulp-newer не улавливает это изменение.

из-за этого я смотрю на путь кеширования, а не на более новый, поскольку мне нужно, чтобы мой основной объединенный файл был сгенерирован, если один из файлов css был удален или изменен, но gulp newer не поддерживает все это.

person lilpug    schedule 01.10.2015