【问题标题】:Using gulp to override only files that already exist is the destination directory使用 gulp 仅覆盖已存在的文件是目标目录
【发布时间】:2016-09-06 16:18:44
【问题描述】:

我正在设置一个工作流程来改进在大型应用程序中检查、编译和分发设计文件的过程。我很想在这个工作流程中使用 gulp,但这样做需要一种同步过程,确保本地目录上的文件首先反映生产(远程)目录中文件的状态。

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

【问题讨论】:

    标签: node.js npm gulp


    【解决方案1】:

    由于您想提取目标中已有的文件,我会这样做:

    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-filter,在 gulp.src()gt() 之间。或者,您可以在gt() 转换流中以编程方式检查文件名,然后只调用cb() 而不是cb(null, vinyl) 来获取要跳过的文件。

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2017-04-09
      • 2017-10-03
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多