2016-05-27 18 views
0

我正在设置一个工作流,以改进在大型应用程序中设计文件的linting,编译和分发过程。我很乐意为这个工作流程使用gulp,但这样做需要一种同步关闭过程,确保本地目录中的文件首先镜像生产(远程)目录中文件的状态。使用gulp仅覆盖已存在的文件是目标目录

我不想拉动远程目录的整个状态,因为它包含了数千个不需要本地存在的自动生成的文件。如何在从远程服务器提取新版本之前检查目标以确认文件名匹配?我不关心哪个文件更新,可以简单地覆盖路径和文件名中匹配的所有内容。

回答

0

既然你想拉你已经有在目标文件,我会做:

var gulp = require('gulp'); 
var gt = require('through-gulp'); 
var read = require('gulp-read'); 

var remote_source_dir = "src/"; // must end with/

gulp.src('destination/**/*', {read:false}) 
    .pipe(gt(function(vinyl,enc,cb) { 
    vinyl.path = remote_source_dir + vinyl.relative; 
    vinyl.base = remote_source_dir; 
    cb(null, vinyl); 
    })) 
    .pipe(read()) 
    .pipe(gulp.dest("destination")); 

背景:咕嘟咕嘟流使用“乙烯”的对象。它们基本上包含文件路径和文件内容。阅读更多here

gulp.src()调用获取我们要更新的目标中的所有文件名。我们将read设置为false,以便不读取目标目录中文件的实际内容(因为我们希望内容实际上是从源目录中读取的)。

gt()创建一个变换流,并且每个乙烯基对象都通过给定的函数。该函数调整文件的路径和基础,以便它们指向(远程)源目录。 cb(null, vinyl);最终报告转换的结果。

然后,read()然后通过将文件内容读入乙烯基对象来转换现在包含正确源文件名的乙烯基。

最后gulp.dest()将文件写入给定的目标目录。提示:要进行测试,您可以将"destination"参数更改为gulp.dest()函数,以将其他参数(例如,其他参数)更改为其他参数,例如和gulp.dest()"destination2",它会将复制的文件输出到不同的目录。然后,您可以比较目的地和目的地2目录以验证正确的操作。

注意:如果目标目录中的某个文件不存在于源目录中,则该脚本将失败。如果要排除目标目录中的某些文件进行复制,可以使用例如gulp-filter,在gulp.src()gt()之间。或者,您可以在gt()转换流中以编程方式检查文件名,并且只需调用cb()而不是cb(null, vinyl)即可查看要跳过的文件。