【问题标题】:How to zip up zip files using Gulp Zip如何使用 Gulp Zip 压缩 zip 文件
【发布时间】:2014-03-27 10:43:45
【问题描述】:

我已经开始使用 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'));

});

有谁知道这是可能的还是我做错了什么?

【问题讨论】:

    标签: gulp gulp-zip


    【解决方案1】:

    我也看到了这个问题,它似乎与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 函数,并建议任务结束。

    【讨论】:

    • 他的解决方案会奏效——除非他没有从zipModels 任务返回流。但是,您的解决方案更好,因为它避免了临时文件。
    • 谢谢,太好了。我已经使用了上面提供的代码,它工作得非常好。我也理解您关于使用简单流和避免使用临时文件的观点。不幸的是,即使不使用临时文件,Gulp 中的 zip 过程也需要 32 秒才能运行,而使用调用 7 zip 的批处理文件大约需要 7 到 9 秒。我能想到的唯一解决方案是在我的 gulp.js 文件中使用 gulp-exec 来调用 7 zip 吗?不过,我愿意接受其他建议。
    • 我认为这与主要问题有点不同,请考虑为它打开另一个问题。但是如果你想提高性能,你可能需要打电话给exec。没有问题。考虑为此编写一个插件,并将{read: false} 传递给gulp.src,因为您并不真正需要文件的内容,只需要拍拍。最好的方法是将内容传送到命令行实用程序,但it will not allow zip files,如果你只能使用 7Zip。
    • @Robini 最后一件事,如果您不一定需要使用 7Zip,请尝试gulp-tar,或环绕tar
    • 谢谢CaioToOn,我同意,这真的是另一个问题。谢谢你的建议,真的很有用。我可能会使用 exec,因为不幸的是,由于我的特殊情况,我不能使用 tar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多