我想使用gulp同步两个文件夹.我已经设法通过一个名为gulp-directory-sync的包来实现这一点(参见下面的包含任务),但是现在我需要根据文件或目录名称以"__"开头的方式从同步中排除一些文件(两个下划线) ).我试图找到一个带有忽略或排除功能的同步插件,但没有成功,所以我现在想知道是否有人可能知道这个的解决方法.
var gulp = require('gulp');
var dirSync = require('gulp-directory-sync');
gulp.task('sync', function () {
return gulp.src('')
.pipe(dirSync('./one', './two'));
});
Run Code Online (Sandbox Code Playgroud)
我总是非常怀疑"插件"在第一行打破了通道.如果你不需要文件gulp-src,你可能不需要gulp来完成那个任务,或者还有其他一些可疑的东西.
Gulp已经很好地将文件复制到其他地方,包括异常,那么为什么不使用这个内置功能呢?使用该gulp-newer插件,我们可以确保只复制那些已更新的文件:
var gulp = require('gulp');
var newer = require('gulp-newer');
var merge = require('merge2');
gulp.task('sync', function(done) {
return merge(
gulp.src(['./one/**/*', '!./one/**/__*'])
.pipe(newer('./two'))
.pipe(gulp.dest('./two')),
gulp.src(['./two/**/*', '!./two/**/__*'])
.pipe(newer('./one'))
.pipe(gulp.dest('./one'))
);
});
Run Code Online (Sandbox Code Playgroud)
这是带有一些注释的相同代码:
var gulp = require('gulp');
var newer = require('gulp-newer');
var merge = require('merge2');
gulp.task('sync', function(done) {
return merge(
// Master directory one, we take all files except those
// starting with two underscores
gulp.src(['./one/**/*', '!./one/**/__*'])
// check if those files are newer than the same named
// files in the destination directory
.pipe(newer('./two'))
// and if so, copy them
.pipe(gulp.dest('./two')),
// Slave directory, same procedure here
gulp.src(['./two/**/*', '!./two/**/__*'])
.pipe(newer('./one'))
.pipe(gulp.dest('./one'))
);
});
Run Code Online (Sandbox Code Playgroud)
这也许可以解决问题,不需要插件;-)
更新
假设您只想复制one到two,并且您可能正在运行一个观察程序,您可以使用gulp中的"已删除"事件来检查哪个文件已经消失:
var gulp = require('gulp');
var newer = require('gulp-newer');
var path = require('path');
var del = require('del');
gulp.task('sync', function(done) {
return gulp.src(['./one/**/*', '!./one/**/__*'])
.pipe(newer('./two'))
.pipe(gulp.dest('./two'));
});
gulp.task('default', function() {
var watcher = gulp.watch('./one/**/*', ['sync']);
watcher.on('change', function(ev) {
if(ev.type === 'deleted') {
// path.relative gives us a string where we can easily switch
// directories
del(path.relative('./', ev.path).replace('one','two'));
}
});
});
Run Code Online (Sandbox Code Playgroud)