2014-01-14 30 views
13

我目前正在尝试将Grunt文件转换为Gulp文件。我的第一次尝试是一个简单的运行JSHint和Mocha的简单文件,并有一个手表模式。我的第一个结果是......很好......幻灭。从Grunt到Gulp

我遇到的几个问题,我希望有解决这些问题的方式:

  • 我意识到,咕嘟咕嘟运行所有任务异步。如果我想等待任务完成,文档会告诉我使用回调,承诺或返回流。但我如何与gulp-mochagulp-jshint做到这一点?这些插件是否支持这个?
  • 未通过gulp-jshint未生成构建失败。如果gulp-jshint失败,我该如何告诉Gulp停止继续?
  • 使用watch模式(如Gulp入门指南中所述)导致运行gulp时出现Too many open files错误。任何想法可能是错误的?

(请注意,我故意没有在这里指定的源代码,因为前两个问题是一般性的问题,最后一个指的是默认的文件。)

任何帮助?

+1

这不是一个直接的答案。你应该尽可能地尝试不打击吞咽的异步行为。大多数情况下,你可能只想连续在同一个文件上运行一堆任务。在这种情况下,您应该完成一项任务,而不是依赖临时文件。 –

+3

这个问题并不是针对对抗异步执行,而是针对任务依赖关系的合理需求(请参阅https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname-deps- fn) - 以及如何让jshint实际上失败。 OP甚至没有提到临时文件... –

+2

Smashing杂志最近发布了一个关于[使用Gulp]的方便指南(http://www.smashingmagazine.com/2014/06/11/building-with-gulp),你可能会发现像我一样有用。 – idleberg

回答

10

关于任务的依赖性,最简单的解决方案是从任务返回吞气流,和依赖在那个任务上。

在下面的代码中,如果“服务器”任务没有返回流,它将异步运行,导致“服务”任务尝试使用不存在的文件运行服务器。

gulp.task('server', function() { 
    return gulp.src('server/**/*.coffee') 
     .pipe(coffeescript()) 
     .pipe(gulp.dest('./dist/')); 
}); 

var expressServer; 

gulp.task('serve', ['server'], function() { 
    var apiServer = require('./dist/server'); 
    expressServer = apiServer(function (server) { 
    server.use(livereload({ 
     port: livereloadport 
    })); 

    }); 

    expressServer.listen(serverport); 

    //Set up your livereload server 
    lrserver.listen(livereloadport); 
}); 
4

对于 “停止和故障” 部分:

这里是jshint的功能例如:

var reporter = require('jshint-stylish'); 
var jshintRc = readJSON('.jshintrc'); 

// Implement asynchronous support returning the stream 
gulp.task('myhinter', function() { 
    // All js in src 
    return gulp.src('./src/*.js') 
    // options from file 
    .pipe(jshint(jshintRc)) 
    // like stylish reporter 
    .pipe(jshint.reporter(reporter)) 
    // Our turn! 
    .pipe(map(function (file, cb) { 
     // Notify the callback "true" if it failed on the file 
     cb(!file.jshint.success, file); 
    })); 
}) 

// Now, define thattask to depend on myhinter 
gulp.task('thattask', ['myhinter'], function(e) { 
    console.warn('thattask is executing'); 
}); 

thattask取决于任务myhinter的成功。

反过来,myhinter会对文件做jshint,记者使用时尚,如果至少有一个文件无法提示,则失败。

在这里,这是通过从myhinter任务返回流实现的。

你可以看到更多的是Orchestrator文档中:https://github.com/robrich/orchestrator

我不使用摩卡,但看看后来就来看看如何做到这一点。

关于打开的文件太多,在OSX上?如果是这样,可能会看到this here,如果它有帮助。

+0

与第一个问题相关,作为总结:至少从今天起(具有任务依赖性),想法是分割'jshint','mocha'和'build'任务,每个任务取决于前一个' gulp.task('name',['dependency'],function(){});'。 – smhg

0

我解决了“太多打开的文件。”在我的.bash_profile加入如下一行:

ulimit -n 10480 
+1

我不确定增加限制对于某些人来说是可以接受的答案,因此是安全风险。我认为在某些时候,吞咽需要“放开”文件流。做到这一点的一种方法是通过shell脚本来链接你的一些吞噬任务。是的,这似乎很奇怪,但吞咽的另一种选择是什么?她会通过npm运行或npm任务/脚本。 – Nick