La funzione gulp.watch()
restituisce un oggetto che ha, tra le altre cose, un metodo end()
si può chiamare - vedi la definizione nel modulo glob-watcher.
Si potrebbe fare qualcosa in queste righe:
var gulp = require('gulp');
function doGitCheckout(callback) {
console.log('doing checkout...');
setTimeout(function() {
console.log('done checkout...');
callback();
}, 1000);
}
var watcher;
gulp.task('watch:start', function() {
if (!watcher) {
watcher = gulp.watch('dist/**/*', ['build']);
console.log('started watcher');
}
});
gulp.task('watch:stop', function() {
if (watcher) {
watcher.end();
watcher = null;
console.log('stopped watcher');
}
});
gulp.task('git:checkout', ['watch:stop'], function(cb) {
console.log('isWatching = ' + !!watcher);
// Start the Git checkout...
doGitCheckout(function() {
// The Git checkout is finished!
gulp.start('watch:start', function() {
cb();
});
});
});
gulp.task('default', ['watch:start', 'git:checkout']);
Gist with this code here
Così abbiamo mantenere un riferimento all'oggetto osservatore quando si inizia a guardare, e hanno un compito di fermare l'osservatore se in esecuzione. La nostra attività Git dipende da watch:stop
per iniziare, quindi avvia il checkout Git, con una richiamata per quando è stata completata. La richiamata avvia l'attività watch:start
, e quando ciò è fatto, finalmente attiviamo la funzione cb
per indicare che git:checkout
è terminato!
Un'alternativa potrebbe utilizzare il add(pattern)
e remove(pattern)
sull'oggetto orologio per spegnerlo e riaccendere invece di distruggere l'oggetto e ricreando esso.
Questo è fantastico! Tranne che non sto dando il via a git dall'interno del copione. ... E, gli spettatori di Gulp stanno dando il via ai compiti ingoiati perché git checkout sta riscrivendo i file di lavoro in copia. Sto cercando un modo per verificare prima se un checkout git è attivo (come perché forse esiste un file .git/checkout.lock o qualcosa di simile?) E impedisce al watcher di eseguire attività temporaneamente fino a quando il checkout git è finito riscrivendo la copia di lavoro – enorl76
Beh c'è un meccanismo di lock file - vedi [questo documento] (https://github.com/git/git/blob/master/Documentation/technical/api-lockfile.txt) per i dettagli tecnici. Ma Git non sta usando un file di blocco per le operazioni di base, sembra che sia usato solo per compiti più lunghi come 'git rebase'. Inoltre non smette di leggere le azioni, in quanto dovrebbe mantenere le cose coerenti. – spiralx
Se si ha il controllo del processo Git, allora sarebbe possibile avere il ricevitore Gulp in ascolto su un socket e accettare i messaggi "suspend" e "resume". È possibile inviare la sospensione prima del processo Git e quindi riprendere dopo averlo terminato. – spiralx