Grunt + пользовательская задача узла-архиватора не работает
У меня есть каталог lib/grunt-tasks
параллельно моему Gruntfile.js
, Оно имеет zip.js
файл в нем (загружается через loadTasks
). Требуется узел-архиватор и fs
модули.
По какой-то причине, хотя файл.zip создан, он ничего не содержит после archive.finalize()
и никогда не увольняет entry
или же error
События.
Я также не получаю никаких ошибок, требующих 2 модуля, поэтому я не думаю, что есть какая-то проблема для задачи, чтобы увидеть родительский node_modules
каталог в корне моего проекта.
Я могу запустить аналогичный JS-скрипт из командной строки: node lib/grunt-tasks/test.js
... с жестко закодированными путями. Интересно, есть ли что-то фундаментальное, что мне не хватает в Grunt и / или Node? Я просто удивлен, что не вижу никаких ошибок, хотя.
Любая помощь приветствуется.
/**
* Zips key messages according to their config data
*
* @see 'app-config.js'
*/
'use strict';
var archiver = require('archiver');
var fs = require('fs');
module.exports = function (grunt) {
grunt.registerMultiTask('zip', function(){
// Load in task config and options
var config = this.data;
var data = config.data;
// Loop through all key messages and generate their .zip files
data.key_messages.forEach(function(message){
var srcDir = config.cwd + "/" + message.path;
var outputFile = config.cwd + '/' + data.project.id + '_' + message.id + '.zip';
// Create an actual file stream to output data to
var output = fs.createWriteStream( outputFile );
// Instantiate new archiver object
var archive = archiver('zip');
archive.on('error', function(err){
console.log('error:', err);
});
archive.on('entry', function(a, b, c){
console.log('entry:', a, b, c);
});
archive.pipe( output );
grunt.log.writeln('Compressing to ' + outputFile.cyan);
archive.bulk([
{cwd: srcDir, src: ['**/*'], expand: true}
]);
archive.finalize();
});
});
}
1 ответ
Это применимо к любому асинхронному процессу в Grunt (о котором я не знал, что это "узел-архиватор")... но все же стоит отметить:
Согласно документации Grunt, асинхронный процесс должен быть настроен с использованием Grunt.task.async(), чтобы предотвратить преждевременное завершение / закрытие задачи.