使用gulp仅覆盖已存在的文件是目标目录

时间:2016-05-27 18:34:55

标签: node.js npm gulp

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

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

1 个答案:

答案 0 :(得分: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"));

背景:Gulp流使用“乙烯基”物体。它们基本上包含文件路径和文件内容。阅读更多here

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

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

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

最后gulp.dest()将文件写入给定的目标目录。

提示:要进行测试,您可以将"destination"功能的gulp.dest()参数更改为其他功能,例如"destination2"并将复制的文件输出到其他目录。然后,您可以比较destination和destination2目录以验证操作是否正确。

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