2014-01-14 12 views
13

Ich experimentiere gerade mit der Umwandlung meiner Grunt-Dateien in Gulp-Dateien. Mein erster Versuch war mit einer recht einfachen Datei, die einfach JSHint und Mocha ausführt und einen Watch-Modus hat. Mein erstes Ergebnis war ziemlich ... naja ... ernüchternd.Von Grunt zu Gulp

ich traf auf mehrere Probleme, und ich hoffe, dass es einen Weg, um sie zu lösen ist:

  • Ich erkannte, dass Gulp asynchron alle Aufgaben ausgeführt wird. Wenn ich auf den Abschluss einer Aufgabe warten möchte, wird in der Dokumentation angegeben, dass ich einen Rückruf, eine Zusage oder einen Stream verwenden soll. Aber wie mache ich das mit gulp-mocha und gulp-jshint? Unterstützen diese Plugins das?
  • Ein Fehler gulp-jshint fehlgeschlagen den Build. Wie kann ich Gulp sagen, dass er fortfahren soll, wenn gulp-jshint fehlgeschlagen ist?
  • Verwendung von watch Modus wie in Gulp's Startanleitung beschrieben in einem Too many open files Fehler beim Ausführen gulp. Irgendeine Idee von was könnte falsch sein?

(Bitte beachten Sie, dass ich absichtlich nicht hier Quellcode angegeben haben, als die ersten beiden Fragen allgemeine Fragen sind, und die letzte bezieht sich auf die Standarddatei.)

Jede Hilfe zu diesem Thema?

+1

Dies ist keine direkte Antwort. Sie sollten so weit wie möglich versuchen, das asynchrone Verhalten von gulp nicht zu bekämpfen. In den meisten Fällen möchten Sie möglicherweise nur eine Reihe von Aufgaben nacheinander in derselben Datei ausführen. In diesem Fall sollten Sie eine Aufgabe ausführen und sich nicht auf temporäre Dateien verlassen. –

+3

Die Frage zielt nicht auf die Bekämpfung der asynchronen Ausführung, sondern auf den sehr legitimen Bedarf an Aufgabenabhängigkeiten (siehe https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname-deps- fn) - und wie jshint eigentlich scheitern kann. Das OP hat nicht mal temporäre Dateien erwähnt ... –

+2

Das Smashing Magazine hat kürzlich einen handlichen Ratgeber zu [gulp verwenden] (http://www.smashingmagazine.com/2014/06/11/building-with-gulp) veröffentlicht finden Sie so nützlich wie ich es getan habe. – idleberg

Antwort

10

Hinsichtlich Aufgabe Abhängigkeiten, die einfachste Lösung ist es, die großen Schluck Strom von der Aufgabe zurückzukehren, und hängen auf diese Aufgabe.

In dem folgenden Code, wenn die „Server“ Aufgabe nicht den Strom zurückkehren, wäre es asynchron ausgeführt werden, in der „dienen“ Aufgabe resultierende einen Server versucht, auszuführen, um eine nicht vorhandene Datei.

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

Für den "stop and fail" Teil:

ist hier ein Funktionsbeispiel mit 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 hängt vom Erfolg der Aufgabe myhinter.

Der Reihe nach myhinter jshint auf Dateien, Reporter mit stilvollen, und schlägt fehl, wenn mindestens eine Datei fehlgeschlagen Hinting.

Hier wird dies implementiert, indem der Stream von der Myhinter-Task zurückgegeben wird.

Sie können mehr über die in der Orchestrierung Dokumentation: https://github.com/robrich/orchestrator

Ich benutze keine Mokka, sondern werfen Sie einen Blick später auf, um zu sehen, wie es geht.

Über die zu viele geöffnete Datei, sind auf OSX? Wenn ja, sehen Sie vielleicht this here, wenn es hilft.

+0

Bezogen auf die erste Frage, zusammenfassend: zumindest ab heute (mit Aufgabenabhängigkeiten), besteht die Idee darin, 'jshint',' mocha' und '' build'' Aufgaben aufzuteilen, jeweils abhängig vom vorherigen mit ' gulp.task ('Name', ['Abhängigkeit'], Funktion() {}); '. – smhg

0

Ich löste das „Zu viele geöffnete Datei ..“ Zugabe in meiner .bash_profile die folgende Zeile:

ulimit -n 10480 
+1

Ich bin nicht sicher, ob das Erhöhen des Limits eine akzeptable Antwort für einige ist, also ein Sicherheitsrisiko. Ich denke, in der Realität muss der Schluck irgendwann den Datenstrom "loslassen". Eine Möglichkeit, dies zu tun, besteht darin, einige Ihrer Schluckaufgaben durch Shell-Skripten zu verketten. Ja, das scheint seltsam, aber was ist die Alternative in Schluck? Sie wird oder npm Aufgaben/Skripte über npm ausführen. – Nick