暂停文件监视器直到git checkout完成

时间:2015-01-30 14:57:43

标签: git gulp git-checkout gulp-watch

开始结账操作时git做了什么?它会写出一个锁文件吗?

我使用gulp,如果git正在积极执行结账操作,我希望它能“暂停”观察者。

我很可能不得不“重新安置”某些东西,让文件观察者重新投入使用。

1 个答案:

答案 0 :(得分:6)

函数gulp.watch()返回一个对象,其中包含您可以调用的end()方法 - 请参阅glob-watcher模块中的定义。

你可以沿着这些方向做点什么:

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

因此,当我们开始观看时,我们会保留对观察者对象的引用,并且如果正在运行则需要停止观察者的任务。我们的Git任务取决于watch:stop开始,然后启动Git结帐,并在完成时回调。回调启动任务watch:start,完成后,我们最终会触发函数cb以指示git:checkout已完成!

替代方案可能是使用监视对象上的add(pattern)remove(pattern)将其关闭然后再打开,而不是销毁对象并重新创建它。