3

我是 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 任务中的特定文件呢?谢谢你的帮助!

4

7 回答 7

5

对于已删除的事件,您可以删除 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');
};

我猜这可能与您期望删除特定文件的内容不同,但可以按预期工作。

于 2013-09-09T13:27:07.160 回答
1

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

https://github.com/paulmillr/chokidar

好吃的也是它的 API:

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

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

当然,这不是您问题的完整答案,而是一个提示。希望能帮助到你。

于 2013-12-10T16:25:00.220 回答
1

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

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

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

于 2013-09-09T13:50:34.337 回答
1

我为此做了一个任务:

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

希望这可以帮助。谨防破坏性。

于 2014-02-05T00:28:53.510 回答
0

Try out my duplicate, which may fit your needs.

It will delete the dest file if the source is deleted, and also it will delete empty folders after delete its contents.

于 2015-01-06T07:01:31.437 回答
0

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

于 2015-03-29T16:03:25.483 回答
0

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

于 2016-07-14T09:54:50.307 回答