2016-07-19 7 views
0

Ich habe ein Verzeichnis lib/grunt-tasks parallel zu meinem Gruntfile.js. Es enthält eine zip.js Datei (geladen über loadTasks). Es erfordert die node-archiver und fs Module.Grunt + benutzerdefinierte Knoten-Archiver-Task funktioniert nicht

Aus irgendeinem Grund, obwohl die ZIP-Datei erstellt wird, enthält es nichts nach archive.finalize() und löst nie die entry oder error Ereignisse.

Ich bekomme auch keine Fehler, die die 2 Module erfordern, also glaube ich nicht, es gibt kein Problem für die Aufgabe, das Elternverzeichnis node_modules im Stammverzeichnis meines Projekts zu sehen.

Ich kann ein ähnliches JS-Skript von der Befehlszeile erfolgreich ausführen: node lib/grunt-tasks/test.js ... mit hart-codierten Pfaden. Ich frage mich, ob etwas Grundlegendes an Grunt und/oder Node fehlt. Ich bin nur überrascht, dass ich keine Fehler sehe.

Jede Hilfe wird geschätzt.

/** 
* 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(); 
     }); 
    }); 
} 

Antwort

0

Diese für jeden asynchronen Prozess innerhalb Grunt gehen würde (was ich war nicht bewusst, ‚node-Archivierungs‘ war) ... aber immer noch bemerkenswert:

Per Grunt in der Dokumentation, ein asynchroner Prozess sollte über Grunt.task.async() eingerichtet werden, um zu verhindern, dass die Aufgabe vorzeitig beendet/beendet wird.

Verwandte Themen