2015-01-19 11 views
11

Ho un file gulp.js che include:Come iniziare Gulp guardare compito quando si digita npm iniziare

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

che inizia il compito orologio

gulp.task('watch', function(){ 
    gulp.watch(productionScripts, ['autoConcat']); 
}); 

Poi su qualsiasi salvati modifiche file in productionScripts, l'attività di watch concaterà i file.

Quello che mi piacerebbe fare, è nel mio package.json, vorrei caricare questo orologio quando digito npm start (questo inizia già il mio server di nodi).

package.json

"start": "node server.js", 

UPDATE --------

Ben (b3nj4m.com), ho provato quello che lei ha dichiarato. L'orologio e il server si avviano. Tuttavia, tutto viene eseguito due volte (probabilmente a causa dell'editor, non correlato), ma perdo il registro del server quando avvio con gulp.

[15:31:18] Starting 'autoConcat'... 
[15:31:18] Finished 'autoConcat' after 147 ms 
[15:31:19] Starting 'autoConcat'... 
[15:31:19] Finished 'autoConcat' after 138 ms 
[15:31:20] Starting 'autoConcat'... 
[15:31:20] Finished 'autoConcat' after 127 ms 
[15:31:23] Starting 'autoConcat'... 

E 'come se ci fosse un anello tra il server riavviando su un cambiamento, e il file che cambia concatenati.

+0

uso 'sorso watch' invece e cravatta avvio e riavviare il server nel processo di orologio sorso, in questo modo quando si cambia il codice per il server, sorso sarà riavviarlo. –

+0

invece di iniziare a npm si consiglia gulp "myFunctionName" con il server che inizia con gulp? Hai un esempio? – SoEzPz

+0

Io no, so solo che è sicuramente possibile. –

risposta

17

è possibile eseguire il server dal gulpfile:

var child = require('child_process'); 
var fs = require('fs'); 

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

gulp.task('server', function() { 
    var server = child.spawn('node', ['server.js']); 
    var log = fs.createWriteStream('server.log', {flags: 'a'}); 
    server.stdout.pipe(log); 
    server.stderr.pipe(log); 
}); 

gulp.task('watch', function(){ 
    gulp.watch(productionScripts, ['autoConcat']); 
}); 

quindi modificare la vostra definizione npm start a guardare come:

"scripts": { 
    "start": "gulp" 
} 
+0

non ti capiteresti di sapere come ottenere il log back? – SoEzPz

+0

'child_process.spawn()' restituisce un oggetto 'ChildProcess', che ha stream' stdout' e 'stderr'. Puoi collegare questi flussi da qualche parte, ad es. in un file. Aggiungerò un esempio alla mia risposta. – Ben

6

Ho qualcosa di simile in uno dei miei progetti. Nota che verrà eseguito lo sfondo di entrambi i processi: è possibile utilizzare ps per ottenere l'ID e interromperlo con kill <pid>.

"scripts": { 
    "start": "{ gulp watch & node server.js & }" 
} 

Per disattivare la registrazione, anche:

"scripts": { 
    "start": "{ gulp watch --silent & node server.js & }" 
} 
+0

Qual è il secondo e per? – SoEzPz

+0

Senza di esso il comando fallirà con un errore 'ELIFECYCLE'; è necessario eseguire lo sfondo di entrambe le attività nell'unico comando. – Ben

4

Una buona pratica da considerare è quella di utilizzare nodemon e gulp-nodemon e quindi, come la risposta accettata, attivare lo script gulp da npm con npm start. È velocissimo e il riavvio del server di nodo avviene in caso di modifiche ai file. Per esempio:

gulpfile.js

var gulp = require('gulp'); 
var nodemon = require('gulp-nodemon'); 

... 

var nodemonOptions = { 
    script: 'bin/www.js', 
    ext: 'js', 
    env: { 'NODE_ENV': 'development' }, 
    verbose: false, 
    ignore: [], 
    watch: ['bin/*', 'routes/*', 'app.js'] 
}; 

gulp.task('start', function() { 
    nodemon(nodemonOptions) 
     .on('restart', function() { 
      console.log('restarted!') 
     }); 
}); 

package.json

{ 
    ... 

    "scripts": { 
     "start": "gulp start" 
    }, 
    "devDependencies": { 
     "gulp": "^3.9.0", 
     "gulp-nodemon": "^2.0.4" 
    } 
} 
8

Si potrebbe concatenare più attività nella vostra start nel package.json usando il pacchetto concurrently in quanto tale:

{ 
    "start": "concurrent \"node server.js\" \"gulp\" " 
} 

E eseguire npm start dal terminale. Ciò eseguirà tutte le istruzioni all'interno di start.

Per i riferimenti: https://www.npmjs.com/package/concurrently

+0

Non dovrebbe essere 'simultaneo' e non' concorrente'? –

+0

Il nome del pacchetto è 'simultaneamente'. Il comando utilizzato per eseguire il pacchetto è 'concorrente'. – nashcheez

+0

@nashcheez Ho fatto ma su npm start lo scss non viene compilato in css come dovrebbe essere. Ecco il codice in package.json: "start": "simultaneamente \" npm esegui tsc: w \ "\" npm esegui lite \ "\" gulp \ "", –