Как запустить createReadStream(поток) в плагине grunt?

Я пытаюсь создать поток в плагине grunt и с треском провалился...

Этот код работает как автономный скрипт узла:

var fs = require('fs');

var sourceFile = 'testfile.log';

fs
    .createReadStream( sourceFile )
    .on('data', function() {
        console.log('getting data');
    })
    .on('end', function() {
        console.log('end!');
    });

Выход

$ node test.js
getting data
end!

Теперь, когда помещаем это в плагин Grunt:

'use strict';

var fs = require('fs');

module.exports = function(grunt) {

    grunt.registerMultiTask('test', 'Testing streams', function() {

        var sourceFile = 'testfile.log';

        fs
            .createReadStream( sourceFile )
            .on('data', function() {
                console.log('getting data');
                grunt.log.oklns('anything?');
            })
            .on('end', function() {
                console.log('end!');
                grunt.log.oklns('nothing?');
            });

    });

};

Выход

$ grunt test
Running "test" (test) task

Done, without errors.

Я тестирую с:

var stats = fs.lstatSync( sourceFile );
if( !stats.isFile() ) { /*etc*/ }

Если файл существует, но мое приложение для проверки узлов находится в той же папке и имеет доступ... Любая помощь приветствуется. Я знаю, что это не должно быть очень трудно сделать;)

1 ответ

Решение

Вы используете асинхронный код внутри задачи Grunt. При этом вы должны сказать grunt дождаться его завершения. Это делается с помощью следующего:

    // Within the task

    var done = this.async();

    // inside a callback of an async function, 
    // i.e. when the read stream is closed */ 

    function(){
      done(true);
    }

Вызов, выполненный с истинным условием, говорит Гранту, что задача выполнена. Если this.async() не вызывается, задача выполняется синхронно. В вашем случае задачи grunt завершаются до того, как поток чтения получит какие-либо данные.

Вы можете прочитать больше об этой конкретной функции здесь (inside-tasks # this.async).

В качестве примечания: предоставленный вами код регистрирует задачу как многозадачность, но код (по крайней мере, в ее текущем состоянии) является основной задачей, а не многозадачностью. Вы можете прочитать о различиях в официальной документации здесь (основные задачи) и здесь (несколько задач).

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