如何在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在当前状态下)是一个基本的任务,而不是一个多任务。 你可以阅读这里的官方文档(基本任务)和这里(多任务)的区别。