Grunt - 如何观看和同步文件删除

时间:2013-09-09 10:24:40

标签: gruntjs grunt-contrib-watch

我是Grunt的新用户。目前我有一个文件夹static_src/img,其中包含图像源文件(.psd)和图像文件(.png,.jpg等)。此文件夹不公开。相反,我想将仅图像文件的更改同步到另一个公用文件夹static/img

问题是 - 当我在static_src/img中添加/更改图像文件时效果很好,但我不知道在删除文件时如何同步更改。 Grunt-contrib-watch可以在static_src/img中检测到删除,但我不知道如何删除static/img中的文件。我尝试了grunt-contrib-clean,但它似乎对我不起作用,也许我没有正确使用它。

我的Gruntfile.js是:

module.exports = function(grunt){
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    copy: {
      dev: {
        files: [
          {expand: true, cwd: 'static_src/img/', src:['**/*.{png,jpg,gif}'], dest: 'static/img/'}
        ]
      }
    },
    clean: {
      dev: {
        src: ['static_src/img/**/*.png']
      }
    },
    watch: {
      copy: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['copy'],
        options: {
          event: ['added', 'changed'],
        }
      },
      remove: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['clean'],
        options: {
          event: ['deleted']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');
};

那么如何删除grunt-contrib-watch任务中的特定文件?谢谢你的帮助!

7 个答案:

答案 0 :(得分:4)

对于已删除的事件,您可以删除static / img中的所有文件,并将static_src / img中的剩余文件复制到static / img。

module.exports = function(grunt){
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    copy: {
      dev: {
        files: [
          {expand: true, cwd: 'static_src/img/', src:['**/*.{png,jpg,gif}'], dest: 'static/img/'}
        ]
      }
    },
    clean: {
      dev: {
        src: ['static/img/**/*.{png,jpg,gif}']    // Changed this from static_src to static
      }
    },
    watch: {
      copy: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['copy'],
        options: {
          event: ['added', 'changed'],
        }
      },
      remove: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['clean', 'copy'],    // Added copy task after clean
        options: {
          event: ['deleted']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');
};

我想这可能与您预期删除特定文件的方式不同,但按预期工作。

答案 1 :(得分:1)

Grunt有一个file API,您可以利用它来处理事件,因此您可以编写一个删除函数,该函数在删除给定的监视文件时运行:

grunt.event.on('watch', function(action, filepath, target) {
  if (action === 'deleted') {
    grunt.file.delete(fileToDelete);
  } 
});

传入文件路径,因此您可以执行类似正则表达式的操作来获取文件名,并在其前面添加适当的路径(如果需要)。

答案 2 :(得分:1)

我强烈建议使用nodejs'watch包装器,它看起来更稳定(2013年12月),并且比原生fs.watch / fs.watchFile更通用。

https://github.com/paulmillr/chokidar

美味也是它的API:

  .on('add'
  .on('addDir'
  .on('change'
  .on('unlink'
  .on('unlinkDir'
  .on('error'

使用此模块时,我的粗略基准测试不会显示性能问题。

当然,这不是你问题的完整答案,而是提示。希望它有所帮助。

答案 3 :(得分:1)

我为此做了一个任务:

https://github.com/taylorcode/grunt-delete-sync

希望这会有所帮助。谨防破坏性。

答案 4 :(得分:0)

尝试我的duplicate,这可能符合您的需求。

如果删除了源文件,它将删除目标文件,并在删除其内容后删除空文件夹。

答案 5 :(得分:0)

使用grunt-rsync代替复制任务,您可以使用delete option同步文件删除。

答案 6 :(得分:0)

这是一个老问题,但对于2016年或之后登陆的任何人来说,现在有一个grunt-sync任务可以处理完全同步,包括删除文件: https://github.com/tomusdrw/grunt-sync