Как заставить gulp-newer работать с gulp-rev?

Настройка так проста:

gulp.task('rev-js',  function() {
  return gulp.src('/js/main.js, {base: '.'})
      .pipe(newer('_build'))
      .pipe(rev())
      .pipe(gulp.dest('_build'))
      .pipe(rev.manifest())
      .pipe(gulp.dest('_build/rev/js'));
});

Очевидно, что gulp-newer здесь не работает, поскольку целевой файл получает другое имя. Любой обходной путь, чтобы заставить gulp-newer (или gulp-измененный) работать в этом случае?

2 ответа

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

newer('_build')

ты можешь написать

newer({dest: '_build', map: mappingFn})

Функция отображения берет относительное имя файла и ожидает, что он вернет переведенное имя - см. Файл index.js. Вы можете определить функцию, которая использует ранее сгенерированный rev-manifest.json манифест для поиска правильного имени файла. Id что-то вроде этого в вашем скрипте сборки (не проверено):

gulp.task('rev-js',  function() {

  // get the existing manifest
  // todo: add logic to skip this if file doesn't exist
  var currentManifest = JSON.parse(fs.readFileSync('rev-manifest.json', 'utf8'));

  // mapping function for gulp-newer
  function mapToRevisions(relativeName) {
    return currentManifest[relativeName]
  }

  return gulp.src('/js/main.js, {base: '.'})
      .pipe(newer({dest: '_build', map: mapToRevisions}))
      .pipe(rev())
      .pipe(gulp.dest('_build'))
      .pipe(rev.manifest())
      .pipe(gulp.dest('_build/rev/js'));
});

Позвольте мне предложить gulp-newy, в котором вы можете манипулировать путем и именем файла в своей собственной функции. Затем просто используйте функцию в качестве обратного вызова к newy(), Это дает вам полный контроль над файлами, которые вы хотите сравнить.

Это позволит сравнивать 1:1 или много к 1.

newy(function(projectDir, srcFile, absSrcFile) {
  // do whatever you want to here. 
  // construct your absolute path, change filename suffix, etc. 
  // then return /foo/bar/filename.suffix as the file to compare against
}

Другие вопросы по тегам