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(), чтобы предотвратить преждевременное завершение / закрытие задачи.

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