Grunt +自定义节点 - 归档任务不起作用

时间:2016-07-19 18:03:57

标签: node.js gruntjs node-archiver

我有一个与lib/grunt-tasks平行的目录Gruntfile.js。它中有一个zip.js文件(通过loadTasks加载)。它需要node-archiverfs模块。

出于某种原因,虽然创建了.zip文件,但它在archive.finalize()之后不包含任何内容,并且永远不会触发entryerror个事件。

我也没有得到任何需要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 个答案:

答案 0 :(得分:0)

这适用于Grunt中的任何异步进程(我不知道'node-archiver')......但仍然值得注意:

Per Grunt的文档中,应使用Grunt.task.async()设置异步过程,以防止任务过早完成/关闭。