2013-02-08 5 views
9

Ich arbeite an einem kleinen Node-Projekt und ich benutze Coffeescript und weniger für clientseitige Code. Ich versuche, meine Entwicklungsumgebung mit Grunt einzurichten. Ich habe für die Ausführung von Server wie folgt benutzerdefinierte Grunzen Aufgabe implementiert:Ausführen von 2 asynchronen Aufgaben mit Grunt

start = require './start' #just a function to start express.js application 
grunt.registerTask 'server', 'Starting server', -> 
    grunt.log.write 'Preparing server to start' 
    done = do @async 
    start (err) -> 
     grunt.log.write "server running at localhost:4000" 

Ich möchte auch die "watch" Task ausgeführt mit Grunzen-contrib-Uhr-Plugin:

grunt.initConfig 
    watch: 
     coffee: 
      files: ['public/coffee/**/*.coffee'] 
      tasks: ['coffee'] 
     jade: 
      files: ['public/jade/**/*.jade'] 
      tasks: ['jade'] 
     less: 
      files: ['public/less/**/*.less'] 
      tasks: ['less'] 

Die Frage ist: Wie um diese beiden Aufgaben (Watch und Server) gleichzeitig laufen zu lassen? Ich möchte einen Server laufen lassen und ihn nicht jedes Mal neu laden, wenn ein clientseitiger Code geändert wird. Vielen Dank im Voraus

Antwort

6

Präfix es auf Ihre Uhr Aufgaben, und loszuwerden der done = do @async in der Server-Task.

tasks: ['server', 'coffee']

Sie wollen eine Option in Ihrer Grunt-Konfiguration für die Server-Task angeben "long-running" oder nicht zu sein. Dann können Sie @async nur aufrufen, wenn Sie lange laufen müssen (ohne Überwachungsaufgabe).

+1

Das funktioniert nicht, weil der Server-Task nicht beenden und somit niemals die Kontrolle an die Überwachungsaufgabe zurückgeben. – Griffin

+0

Ja, es endet; Wie ich in meiner Antwort erkläre, entfernen Sie den async() -Aufruf, mit dem die Aufgabe beendet werden kann, und fügen ihn dann aufgrund einer Option bedingt zurück. – tbranyen

+3

Ich bin verwirrt. Er möchte, dass der Server immer lang läuft, und er möchte, dass die Uhr lange läuft und er möchte, dass beide gleichzeitig von einem einzigen Grunzruf ausgehen. Ist das, was du hier erreichst? Sieht nicht so aus –

0

Ich hatte das gleiche Problem von nicht in der Lage, sowohl Watch-und Connect-Server von einem Grunt-Task zu starten.

das Problem zu lösen, begann ich den Server als Hintergrundprozess Grunzen-exec in meinem Gruntfile

The Ampersand (&) am Ende der grunt connect:preview & Verwendung ist es, was den Server als Hintergrundprozess gestartet wird.

,exec: { 
    start_server: { 
    command: 'grunt connect:preview &' 
    } 
} 

Und dann die Grunzen Aufgabe wie diese ein besserer Weg, bekommt es gibt

grunt.registerTask('preview', ['clean:preview', 'template', 'exec', 'watch' ]); 

zu registrieren, um dies zu tun, aber es ist so weit das Beste, was ich denken konnte.

+0

Ich benutze grunt-shell statt grunt-exec und das '&' scheint keinen Effekt zu haben. –