Как запустить 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).
В качестве примечания: предоставленный вами код регистрирует задачу как многозадачность, но код (по крайней мере, в ее текущем состоянии) является основной задачей, а не многозадачностью. Вы можете прочитать о различиях в официальной документации здесь (основные задачи) и здесь (несколько задач).