我有以下gulpfile.js,我通过命令行“gulp message”执行:
var gulp = require('gulp'); gulp.task('message',function() { console.log("HTTP Server Started"); });
我收到以下错误消息:
[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js [14:14:41] Starting 'message'... HTTP Server Started [14:14:41] The following tasks did not complete: message [14:14:41] Did you forget to signal async completion?
我在Windows 10系统上使用gulp 4.这是gulp的输出–version:
[14:15:15] CLI version 0.4.0 [14:15:15] Local version 4.0.0-alpha.2
解决方法
由于您的任务可能包含异步代码,因此当您的任务执行完毕(=“异步完成”)时,必须通知gulp.
在Gulp 3.x你可以逃避,而不做这个.如果没有显式地指示异步完成,那么gulp只会假设你的任务是同步的,一旦你的任务函数返回就完成了. Gulp 4.x在这方面更加严格.你必须明确地表明任务完成.
你可以在five ways做到这一点:
1.返回Stream
如果您只是尝试打印某些东西,这不是真正的选择,但它可能是最常用的异步完成机制,因为您通常使用gulp流.这是一个(相当有创意的)示例,为您的用例演示:
var print = require('gulp-print'); gulp.task('message',function() { return gulp.src('package.json') .pipe(print(function() { return 'HTTP Server Started'; })); });
2.返回Promise
这是一个更适合您的用例的机制.请注意,大多数情况下,您不必自己创建Promise对象,它通常由软件包提供(例如经常使用的del
软件包返回Promise).
gulp.task('message',function() { return new Promise(function(resolve,reject) { console.log("HTTP Server Started"); resolve(); }); });
这可能是您的用例最简单的方式:gulp自动将回调函数作为第一个参数传递给您的任务.完成后请调用该功能:
gulp.task('message',function(done) { console.log("HTTP Server Started"); done(); });
4.返回child process
如果您必须直接调用命令行工具,这是非常有用的,因为没有可用的node.js包装器.它适用于您的用例,但显然我不会推荐它(特别是因为它不是很便携):
var spawn = require('child_process').spawn; gulp.task('message',function() { return spawn('echo',['HTTP','Server','Started'],{ stdio: 'inherit' }); });
5.返回RxJS Observable
.
我从来没有使用过这个机制,但是如果你使用RxJS,这可能是有用的.如果您只想打印一些东西,那就太过分了:
var Observable = require('rx').Observable; gulp.task('message',function() { var o = Observable.just('HTTP Server Started'); o.subscribe(function(str) { console.log(str); }); return o; });