如何在grunt插件中运行createReadStream(一个stream)?

我正在试图在一个咕噜声插件中创build一个stream,并失败…

此代码作为独立节点脚本运行:

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! 

现在,当把这个插入一个咕噜插件:

 '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. 

我正在testing:

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

如果该文件存在,但我的节点testing应用程序在同一个文件夹,并有访问…任何帮助表示赞赏。 我知道这不是很难做到;)

您正在使用Grunt任务内的asynchronous代码。 这样做时,你必须告诉咕噜等待它完成。 这是通过以下方式完成的:

  // Within the task var done = this.async(); // inside a callback of an async function, // ie when the read stream is closed */ function(){ done(true); } 

调用完成的条件告诉Grunt任务完成。 如果this.async()未被调用,则该任务将同步执行。 在你的情况下,咕噜的任务在读取stream接收到任何数据之前完成。

你可以在这里阅读更多关于这个特殊的function(inside-tasks#this.async) 。

作为一个方面说明,你提供的代码将任务注册为一个多任务,但是代码(至less在当前状态下)是一个基本的任务,而不是一个多任务。 你可以阅读这里的官方文档(基本任务)和这里(多任务)的区别。

Interesting Posts