Как заархивировать почтовые файлы, используя Gulp Zip

Я начал использовать Gulp JS и должен признать, что это действительно полезно.

Одна из задач, которые мне нужно выполнить, - это заархивировать коллекцию папок в отдельные zip-файлы, по одной для каждой папки, а затем сжать все эти 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-файлы в один zip-файл под названием "Templates.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 ответ

Решение

Я также видел проблему, и это, кажется, связано с cwd вариант как-то. Я буду расследовать дальше.

После комментария @OverZealous я продолжил расследование и обнаружил две проблемы:

  1. По его словам, нужно намекнуть глотком, чтобы дождаться окончания задачи зависимости (zipModels), возвращая поток из него. Поскольку у вас есть несколько потоков, вы можете использовать event-stream.merge вернуть пакетный поток.

  2. Причина, по которой не работает 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 труба, и используйте эту функцию на всех подзадачах.

Кроме того, всегда старайтесь подсказывать асинхронные задачи , возвращая stream , promise или получать callback функция, и посоветуйте конец задачи.

Другие вопросы по тегам