如何使用Gulp Zip压缩zip文件

时间:2014-03-27 10:43:45

标签: 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'));

});

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

  3. 重要

    无论如何,应该避免使用临时文件。 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功能,并建议任务结束。