我是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任务中的特定文件?谢谢你的帮助!
答案 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)
答案 4 :(得分:0)
尝试我的duplicate,这可能符合您的需求。
如果删除了源文件,它将删除目标文件,并在删除其内容后删除空文件夹。
答案 5 :(得分:0)
使用grunt-rsync代替复制任务,您可以使用delete option同步文件删除。
答案 6 :(得分:0)
这是一个老问题,但对于2016年或之后登陆的任何人来说,现在有一个grunt-sync任务可以处理完全同步,包括删除文件: https://github.com/tomusdrw/grunt-sync