2014-01-14 9 views
13

私は現在、GruntファイルをGulpファイルに変換することを実験中です。私の最初の試みは、単にJSHintとMochaを実行し、時計モードを持っている非常に単純なファイルを使っていました。私の最初の結果はかなり...まあ...幻滅でした。GruntからGulpへ

私はいくつかの問題が発生した、と私はそれらを解決する方法があることを願っています:

  • 私はガルプは非同期ですべてのタスクを実行することを実現しました。タスクが完了するのを待つ場合は、コールバックや約束を使用したり、ストリームを返すように指示されています。しかし、私はgulp-mochagulp-jshintでどうすればいいですか?これらのプラグインはこれをサポートしていますか?
  • 失敗したgulp-jshintはビルドに失敗しませんでした。 gulp-jshintが失敗した場合、Gulpに処理を中止するように通知するにはどうすればよいですか?
  • gulpを実行すると、Gulpの開始ガイドに記載されているwatchモードを使用すると、Too many open filesエラーが発生しました。何が間違っているのだろうか?

(最初の二つの質問は、一般的な質問で、最後の1は、デフォルトのファイルを参照するように私が意図的に、ここではソースコードを指定していないことに注意してください。)

この上の任意の助けを? "停止して失敗" の部分については

+1

これは直接的な回答ではありません。 gulpの非同期動作と戦わないようにできるだけ試してください。ほとんどの場合、同じファイルに対して一連のタスクを連続して実行したいだけかもしれません。そのような場合は、1つのタスクを作成し、一時ファイルに依存しないようにする必要があります。 –

+3

この質問は、非同期実行との戦いを目指すものではありませんが、タスクの依存関係の正当な必要性に関するものです(https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname-deps- fn) - 実際にjshintを失敗させる方法。 OPはテンポラリファイルについても言及していませんでした... –

+2

Smashing Magazineは最近、[Gulpを使用して](http://www.smashingmagazine.com/2014/06/11/building-with-gulp)の便利なガイドを掲載しました。私がしたのと同じくらい役に立つと思う。 – idleberg

答えて

10

を、最も簡単な解決策は、タスクから一気ストリームを返すことで、依存その仕事に

"server"タスクがストリームを返さない場合、ストリームは非同期で実行されるため、存在しないファイルを使用してサーバーを実行しようとする "serve"タスクが発生します。

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

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の成功に依存します。ここでは

はjshintと機能の例です。

また、myhinterはスタイリッシュを使用してファイルをjshintし、少なくとも1つのファイルがヒントに失敗した場合に失敗します。

これは、myhinterタスクからストリームを返すことで実装されます。

あなたはオーケストレーターのドキュメントでその詳細を見ることができます:私はモカを使用していないが、それを行う方法を確認するために後で見てみましょう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

私は、制限を増やすことがセキュリティリスクのように受け入れられるとは限りません。私は実際には、ある時点では、ファイルのストリームを "放棄"する必要があると思う。これを行う1つの方法は、シェルスクリプトを使用して、いくつかのgulpタスクを連鎖させることです。はい、これは奇妙に思えますが、何をガルプの代わりにしていますか?彼女はnpmを使ってタスク/スクリプトを実行します。 – Nick

関連する問題