2014-05-07 7 views
13

Kurz: begann vor kurzem mit Gulp (konvertieren von Grunt), und versuche, beide Standard Gulp Watch-Aufgabe (nicht gulp-watch von npm) für SASS/JS/HTML und gulp-nodemon zu verwenden (von npm), um einen Express-Server nach Änderungen neu zu starten. Wenn es nur gulp watch läuft, funktioniert es gut; und wenn gulp server (für nodemon) ausgeführt wird, funktioniert das gut. Wenn Sie jedoch beide zusammen verwenden (unten in der Konfiguration der Standardaufgabe gezeigt), funktioniert das Uhrzeug nicht. Die Aufgabe wird ausgeführt, und auf dem CLI-Gulp werden für die Überwachungstasks "Starten" und "Beendet" angezeigt, aber die Dateien werden nicht aktualisiert.Gulp Watch und Nodemon Konflikt

Relevante Aufgabe Konfigurationen:

Concat javascript:

gulp.task('js:app', function(){ 
     return gulp.src([ 
      pathSource('js/application/modules/**/*.js'), 
      pathSource('js/application/_main.js') 
     ]) 
     .pipe(concat('application.js')) 
     .pipe(gulp.dest('./build/assets/js')).on('error', utils.log); 
    }); 

Nodemon, Neustart bei Änderungen App auszudrücken:

gulp.task('express', function(){ 
     return nodemon({script:'server.js', ext:'js', cwd: __dirname + '/express', legacyWatch: true}) 
     .on('restart', function(){ 
      //gulp.run('watch'); // doesn't work :(
     }); 
}); 

Uhr Javascript Änderungen und laufen js : App zum Beschriften.

gulp.task('default', ['watch', 'express']); 

Wenn jemand irgendwelche Ideen, danke im voraus hat:

gulp.task('watch', function(){ 
     gulp.watch(pathSource('js/application/**/*.js'), ['js:app']); 
    }); 

Standardaufgabe, schluck Uhr und nodemon gleichzeitig initialisiert werden!

Antwort

16

gulp.run Anrufe wurden deprecated, also würde ich einen anderen Ansatz versuchen. Da Sie bereits gulp verwenden, kann ich vorschlagen, gulp-nodemon einen Versuch zu geben?

Per Zug-nodemon documentation, können Sie es eine Reihe von Aufgaben übergeben auszuführen:

UPDATE: Hier ist die vollständige gulpfile.js Datei zusammen mit einer Arbeitsprobe on github.

'use strict'; 

// Main dependencies and plugins 
var gulp = require('gulp'); 
var jshint = require('gulp-jshint'); 
var concat = require('gulp-concat'); 
var uglify = require('gulp-uglify'); 
var rename = require('gulp-rename'); 
var nodemon = require('gulp-nodemon'); 

var assets = 'assets/js/**/*.js'; 
var publicDir = 'public/javascripts'; 

// Lint Task 
gulp.task('lint', function() { 
    return gulp.src(assets) 
    .pipe(jshint()) 
    .pipe(jshint.reporter('jshint-stylish')); 
}); 

// Concatenate and minify all JS files 
gulp.task('scripts', function() { 
    return gulp.src(assets) 
    .pipe(concat('global.js')) 
    .pipe(gulp.dest(publicDir)) 
    .pipe(rename('global.min.js')) 
    .pipe(uglify()) 
    .pipe(gulp.dest(publicDir)); 
}); 

// Watch Files For Changes 
gulp.task('watch', function() { 
    gulp.watch(assets, ['lint', 'scripts']); 
}); 

gulp.task('demon', function() { 
    nodemon({ 
    script: 'server.js', 
    ext: 'js', 
    env: { 
     'NODE_ENV': 'development' 
    } 
    }) 
    .on('start', ['watch']) 
    .on('change', ['watch']) 
    .on('restart', function() { 
     console.log('restarted!'); 
    }); 
}); 

// Default Task 
gulp.task('default', ['demon']); 

Auf diese Weise erzeugen Sie die watch Aufgabe beim Start des nodemon und sicherzustellen, dass die watch Aufgabe wieder ausgelöst wird, wenn nodemon Ihre Anwendung neu gestartet.

EDIT: scheint sollten Sie die On- change event from gulp-nodemon anrufen, die Aufgaben zusammenstellen behandelt vor das restart Ereignis auslöst.

EDIT: Es nodemon das scheint on('change', callback) von ihren API

+0

Gaston - das Setup, das ich verwende, ist bereits w/schluck-nodemon tatsächlich; Allerdings habe ich es nicht so konfiguriert, dass es die Überwachungsaufgabe bei Änderung neu starten würde. Ich werde es versuchen und Sie wissen lassen. Danke! – jiveTurkey

+0

so war es nicht möglich, es so zu arbeiten. Was verwirrte mich: wenn ich die nodemon-Task wie folgt ausführe: 'gulp.task ('dämon', ['watch'], function() {nodemon ({...})}} ', beide knotenmon UND die Watch-Task wird ausgeführt und zeigt die Ausgabe einer Datei an, die sich ändert - aber die Änderungen von der Überwachungsaufgabe werden nicht in die entsprechenden Dateien geschrieben. wie die Aufgabe ausgeführt wird, aber die Änderungen nicht auf die Festplatte überträgt. – jiveTurkey

+1

@jiveTurkey Ich habe meine Antwort mit der vollständigen gulpfile aktualisiert und ein funktionierendes [github-Beispiel] (https://github.com/gfestari/gulp-sample) hinterlassen. Im Grunde wird dies "nodemon" starten und mit einer "gulp-watch" Aufgabe verknüpfen, um Dateiänderungen zu überwachen. Lass mich wissen wie es geht;) – Gaston

4

FWIW entfernt wird, scheint es, dass auf schluck-nodemon Konfiguration tatsächlich den cwd Parameter verwendet setzt den gesamten Zug cwd in dieses Verzeichnis. Das bedeutet, dass zukünftige Aufgaben im falschen Verzeichnis ausgeführt werden.

Ich hatte dieses Problem, wenn ich auf meinem Frontend-Server zur selben Zeit gulp watch-Aufgaben wie knotemon tasks auf meinem Backend-Server (in derselben gulp-Datei) ausführte, gab es eine Race-Bedingung, in der, wenn der nodemon-Befehl zuerst ausgeführt wurde Frontend-Sachen würden eigentlich in (Home)/Backend/Frontend anstatt (Home)/Frontend eingebaut, und alles würde von dort aus birnenförmig aussehen.

Ich fand, dass die Verwendung von Uhr und Skriptparameter auf gulp-nodemon um diese (obwohl es immer noch aussieht wie nodemon sieht mein ganzes Projekt für Änderungen statt das eingebaute Backend-Verzeichnis).