Gulp 吞咽手表删除文件

Gulp 吞咽手表删除文件,gulp,gulp-watch,Gulp,Gulp Watch,我是个新手,我做了一些研究,但没有找到解决办法。。这是我的大口文件 var gulp = require('gulp'); var watch = require('gulp-watch'); var imagemin = require('gulp-imagemin'); var browserSync = require('browser-sync').create(); var paths = { src: 'src/', dist: 'dist/', html

我是个新手,我做了一些研究,但没有找到解决办法。。这是我的大口文件

var gulp = require('gulp');
var watch = require('gulp-watch');
var imagemin = require('gulp-imagemin');
var browserSync = require('browser-sync').create();


var paths = {
    src: 'src/',
    dist: 'dist/',
    html: '**/*.html',
    php: '**/*.php',
    images: {
        src: 'assets/img/**/*.{png,jpg,jpeg,svg,gif}',
        dist: 'assets/img'
    },
    misc: '**/*.{ico,htaccess,txt}'
}


/**
 * Files
 */
gulp.task('files', function(){

    return gulp.src([
        paths.src + paths.php,
        paths.src + paths.html,
        paths.src + paths.misc
    ])
    .pipe(gulp.dest(paths.dist))
    .pipe(browserSync.stream());

});

/**
 * Images
 */
gulp.task('images', function(){

    return gulp.src(
        paths.src + paths.images.src
    )
    .pipe(imagemin({
        progressive: true
    }))
    .pipe(gulp.dest(paths.dist + paths.images.dist))
    .pipe(browserSync.stream());

});

/**
 * Serve
 */
gulp.task('serve', ['files', 'images'], function(){

    browserSync.init({
        server: {
            baseDir: 'dist'
        }
    });

    watch([
        paths.src + paths.php,
        paths.src + paths.html,
        paths.src + paths.misc
    ], function(){ gulp.start('files') }); 


    watch(
        paths.src + paths.images.src
    , function(){ gulp.start('images') }); 

});
一切正常,但在查看“src”文件夹中的文件(服务任务)时,当我在“src”中删除文件(图像或html、php等)时,“dist”文件夹中的文件不会被删除

当文件更改或添加时,没有问题。。我发现了一些类似的话题,但没有找到解决方案


谢谢。

您的
dist
文件夹中没有删除文件的原因是
gulp.watch()
只要在监视的文件更改时重新运行任务即可。该任务不知道它运行的原因是因为删除了一个文件。它只处理其
gulp.src()
语句中与glob匹配的所有文件

由于已删除的文件不再存在,因此
gulp.src()
不会拾取该文件,并且您的任务不会处理它。它只是像在您的
dist
文件夹中一样保留,而其他文件则被覆盖

解决此问题的一种方法是按照配方操作:


您的图像处理将类似。

谢谢Sven,没关系:)请注意,Sven提供的上述链接在2018年8月中旬有一个小错误。它用
取消链接
而不是
更改
显示配方。如你在斯文的回答中所看到的,坚持
change
,你会做得很好。
del
的API似乎也会更新(您现在传递的是字符串数组,而不是字符串本身)。更多信息和。更正,Sven提供的链接非常过时。它还缺少一个IF块来测试
是否已删除
。除已更新的
del
外,Sven的上述代码工作正常。
var fileWatcher = watch([
    paths.src + paths.php,
    paths.src + paths.html,
    paths.src + paths.misc
], function(){ gulp.start('files') }); 

fileWatcher.on('change', function (event) {
    if (event.type === 'deleted') {
        var filePathFromSrc = path.relative(path.resolve(paths.src), event.path);
        var destFilePath = path.resolve(paths.dist, filePathFromSrc);
        del.sync(destFilePath);
    }
});