Задать вопрос
IIIu6ko
@IIIu6ko

Как удалить только то, что было удалено?

Есть такие таски
gulp.task('imgs', function() {
	return gulp.src('src/blocks/**/*.{jpg,jpeg,png,gif,svg}')
		.pipe(flatten())
		.pipe(gulp.dest('public/imgs'));
});

gulp.task('default', ['imgs'], function() {
	gulp.watch('src/blocks/**/*.{jpg,jpeg,png,gif,svg}', ['imgs']);
});

Запускаем gulp. Создаётся папка public с папкой imgs, в которой все изображения из папок src/blocks/**.
Если добавить изображение например в папку blocks, то сработает watch и перекинет это изображение в public/imgs, а если удалить это же изображение, то также сработает watch, но изображение из public/imgs не удалится.

Есть вариант использовать del и удалять всю папку public/imgs и потом заново собирать все старые изображения и вместе с ними цеплять новые и перекидывать в public/imgs и при удалении изображения будет тоже самое происходить, но удалённого изображения уже не будет, т.к. gulp соберёт все изображения заново.
Этот способ, мягко говорят, так себе.. Если мало изображений, то ещё ладно, а вот если много, то это уже будет требовать какого-то времени.

Нужен плагин, который когда gulp заметит изменения и пройдётся с помощью src по всем папкам blocks - gulp.src('src/blocks/**/*.{jpg,jpeg,png,gif,svg}'), сравнивал все файлы которые нашёл с файлами, которые лежат в папке public/imgs и удалял, либо добавлял конкретный файл, а не все.

Кто-нибудь знает подобный плагин? Необязательно, чтобы он работал как я описал.. Главное чтобы он удалял или добавлял конкретный файл.
  • Вопрос задан
  • 315 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
delphinpro
@delphinpro Куратор тега Gulp.js
frontend developer
не стоит заморачиваться, мне кажется. сделать таск clean, очищающий всё, который запускать перед сборкой продакшн билда.

Но если приспичило, посмотрите в скринкасте Ильи Кантора. В одной из частей он рассказывает, как можно сделать синхронное удаление файлов в dist и src
Ответ написан
IIIu6ko
@IIIu6ko Автор вопроса
Решил проблему с помощью данного рецепта
https://github.com/gulpjs/gulp/blob/4.0/docs/recip...

Спасибо Сергей (за совет глянуть Илью) и Илья Кантор (за скринкаст, а именно вот за этот момент https://youtu.be/jocvHauHcA4?t=6m33s )

Собственно вот код:
// gulp@4.0.0-alpha.2

var gulp = require('gulp');
var del = require('del');
var path = require('path');
var flatten = require('gulp-flatten'); 

gulp.task('imgs', function() {
  return gulp.src('src/blocks/**/*.{jpg,jpeg,png,gif,svg}')
    .pipe(flatten()) // Удаляет относительный путь до файла.
    .pipe(gulp.dest('public/imgs'))
    .pipe(browserSync.stream());
});

gulp.task('watch', function() {
  gulp.watch('src/blocks/**/*.{jpg,jpeg,png,gif,svg}', gulp.series('imgs')).on('unlink', function (filepath) {
    var filePathFromSrc = path.relative(path.resolve('src/blocks/'), filepath);
    // Concatenating the 'build' absolute path used by gulp.dest in the scripts task
    var destFilePath = path.resolve('public/imgs', filePathFromSrc);
    del.sync(destFilePath);
  });
});
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
werty1001
@werty1001
undefined
Согласен на счет заморочки, оно того не стоит, но если очень хочется, то примерно так:
// Gulp 4
gulp.watch( 'src/blocks/**/*.{jpg,jpeg,png,gif,svg}', gulp.series( 'imgs' ) ).on( 'unlink', function( delPath ) {

	let path = require( 'path' ), file = path.basename( delPath );

	try {

		require( 'fs' ).unlinkSync( path.join( 'public', 'imgs', file ) );

	} catch (e) { console.log(e); }

});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы