GULP: переименовать только затронутый файл

Я хочу создать копию с новым расширением в той же папке только того файла, который был изменен. Как должны быть указаны src и dest?

var gulp = require('gulp'),
rename = require("gulp-rename"),
watch = require('gulp-watch');


var filePath = "./repo/**/*.xml"

gulp.task('watch', function () {    
    watch(filePath, gulp.series('rename'));
});


gulp.task('rename', function () {
    return gulp.src(???).pipe(rename(function (path) {
        path.extname = ".mei";
    })).pipe(gulp.dest(???));
});

person o-sapov    schedule 18.08.2020    source источник


Ответы (1)


Попробуй это:

var gulp = require('gulp'),
  rename = require("gulp-rename"),
  watch = require('gulp-watch'),
  changedInPlace = require('gulp-changed-in-place');


var filePath = "./repo/**/*.xml"

gulp.task('watch', function () {    
    watch(filePath, gulp.series('rename'));
});


gulp.task('rename', function () {
  return gulp.src(filePath)
    .pipe(changedInPlace())
    .pipe(rename(function (path) {
      console.log(path);
        path.extname = ".mei";
    }))
    .pipe(gulp.dest('repo'));
});

gulp.task('default', gulp.series('rename', 'watch'));

При этом используется плагин gulp-changed-in-place для передачи только файлов которые изменились в том же каталоге (в вашем случае filePath).

У него есть опция firstRun, но я не смог заставить ее работать должным образом - может быть, эта опция плохо работает с gulp v4? Чтобы обойти это, rename вызывается один раз перед установкой watch, см.

gulp.task('default', gulp.series('rename', 'watch'));

Теперь он изменит только расширение измененного файла и добавит этот измененный файл обратно в тот же каталог, в котором он был запущен.

person Mark    schedule 18.08.2020