Как заархивировать почтовые файлы, используя 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 я продолжил расследование и обнаружил две проблемы:
По его словам, нужно намекнуть глотком, чтобы дождаться окончания задачи зависимости (
zipModels
), возвращая поток из него. Поскольку у вас есть несколько потоков, вы можете использоватьevent-stream.merge
вернуть пакетный поток.Причина, по которой не работает 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
функция, и посоветуйте конец задачи.