gulp - 如何使用 Gulp Zip 压缩 zip 文件

标签 gulp gulp-zip

我已经开始使用 Gulp JS,并且必须承认我发现它真的很有用。

我需要执行的任务之一是将一组文件夹压缩到单独的 zip 文件中,每个文件夹一个,然后将所有这些压缩文件压缩到一个 zip 文件中。使用 Gulp-Zip 我已经成功做到了这一点:

var modelFolders = [
        'ELFH_Check',
        'ELFH_DDP',
        'ELFH_Free'
];

gulp.task('zipModels', function () {

        for (var i = 0; i < modelFolders.length; i++) {

            var model = modelFolders[i];

            gulp.src('**/*', {cwd: path.join(process.cwd(), '/built_templates/' + model) })
            .pipe(zip(model + '.zip'))
            .pipe(gulp.dest('./built_templates'));

        };

});

这有效并输出 ELFH_Check.zip、ELFH_DDP.zip 和 ELFH_Free.zip。但是,然后我需要将这些 zip 文件压缩到一个名为“Templates.zip”的 zip 文件中,但我无法完成这项任务:

// zip up model files
gulp.task('zipTemplate', ['zipModels'], function () {  

        gulp.src('*.zip', {cwd: path.join(process.cwd(), './built_templates/') })
               .pipe(zip('Templates_.zip'))
               .pipe(gulp.dest('./built_templates'));

});

有谁知道这是否可行或我做错了什么?

最佳答案

我也看到了这个问题,它似乎与 cwd 选项有某种关系。我会进一步调查。

@OverZealous 评论后,我进一步调查,发现两个问题:

  1. 正如他所说,您需要通过返回一个流来提示 gulp 等待依赖任务 (zipModels) 结束。由于您有多个流,因此可以使用 event-stream.merge返回捆绑流。

  2. bundle zip 不起作用的原因是因为您 cwd 指向 /built_templates/,而第二个斜杠导致了一些问题。要正常工作,您需要删除结尾的斜线,因此它应该是 path.join(process.cwd(), '/built_templates')

重要

无论如何,您应该避免使用临时文件。 Gulp 哲学是尝试使用管道来避免 IO。在那个方向上,您要做的是减少中间的 dest 步骤,merge流,zip 它们,最后输出它们。

类似的东西:

var es = require('event-stream');

var modelFolders = [
    'ELFH_Check',
    'ELFH_DDP',
    'ELFH_Free'
];

gulp.task('zipModels', function () {
    var zips = [],
        modelZip;

    for (var i = 0; i < modelFolders.length; i++) {
        var model = modelFolders[i];

        modelZip = gulp.src('**/*', {cwd: path.join(process.cwd(), '/built_templates/' + model) })
          .pipe(zip(model + '.zip'));

        // notice we removed the dest step and store the zip stream (still in memory)
        zips.push(modelZip);
    };

    // we finally merge them (the zips), zip them again, and output.
    return es.merge.apply(null, zips)
        .pipe(zip('templates.zip'))
        .pipe(gulp.dest('./'));
});

根据您的文件夹名称 (built_templates),您似乎还有一些其他任务会生成临时构建文件。最好,您也不需要这些。您应该将它们的流直接通过管道传输到 ZIP 流,最后,通过管道传输到 bundle-zip 流。通过这样做,您将拥有一个简单的流,读取一张磁盘,最后写入一张磁盘,没有临时文件。

如果您需要它们作为不同的任务,请考虑使用一个函数来生成直到 gulp.dest 管道之前的步骤的流,并在所有子任务上使用此函数。

此外,始终尝试提示您的异步任务 by returning a stream, a promise or receiving a callback函数,并通知任务结束。

关于gulp - 如何使用 Gulp Zip 压缩 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22685174/

相关文章:

javascript - 配置 Gulp 以反射(reflect) css 更改

javascript - 让 Gulp 合并/解析需要的 js 文件

node.js - 调试已通过 Gulp 任务启动的 Node.js Web 应用程序

javascript - 使用 gulp-useref 如何添加额外文件?

javascript - 使用特定目录将管道文件吞入 zip

gulp-zip 忽略隐藏文件

javascript - gulp 通知发生在任务完成之前