2015-01-30 9 views

Odpowiedz

6

Funkcja gulp.watch() zwraca obiekt, który ma między innymi metodę, którą można wywołać - patrz definicja w module glob-watcher.

Można zrobić coś wzdłuż tych linii:

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

więc zachować odniesienie do obiektu obserwatora kiedy zaczniemy oglądać, i mają za zadanie zatrzymać obserwatora, jeśli uruchomiony. Nasze zadanie Git zależy od watch:stop, aby rozpocząć, a następnie uruchamia kasę Git, z wywołaniem zwrotnym, gdy jest zakończona. Oddzwanianie rozpoczyna zadanie watch:start, a kiedy to zrobimy, w końcu wywołujemy funkcję cb, aby wskazać, że zakończyło się git:checkout!

Alternatywą może być użycie obiektu add(pattern) i remove(pattern) na obiekcie oglądania, aby go wyłączyć, a następnie ponownie, zamiast niszcząc obiekt i odtwarzając go.

+0

To świetnie! Z wyjątkiem tego, że nie wyrzucam git z wnętrza skryptu gulp. ... A obserwatorzy łykają odruchy, bo git checkout przepisuje pliki kopii roboczych. Szukam sposobu, aby najpierw sprawdzić, czy jest aktywne pobieranie git (np. Ponieważ może istnieje plik .git/checkout.lock lub coś podobnego?) I uniemożliwia obserwatorowi wykonywanie zadań tymczasowo, dopóki nie skończy się przepisywanie git. kopia robocza – enorl76

+0

Istnieje również mechanizm pliku blokady - patrz [ten dokument] (https://github.com/git/git/blob/master/Documentation/technical/api-lockfile.txt) w celu uzyskania szczegółów technicznych. Ale Git nie używa pliku blokady do podstawowych operacji, wygląda na to, że jest używany tylko do dłuższych zadań, takich jak 'git rebase'. Nie zatrzymuje również działań odczytu, ponieważ ma zachować spójność. – spiralx

+0

Jeśli masz kontrolę nad procesem Git, możliwe jest, że obserwator Gulp nasłuchi na gnieździe i zaakceptuje komunikaty "zawieszenie" i "wznowić". Możesz wysłać zawiesić przed procesem Git, a następnie wznowić po zakończeniu. – spiralx

Powiązane problemy