当gulpfile.js发生变化时,我正试图重新运行我的gulp构建,但是我的研究引导我的方法存在问题。
我有一个观察者用于我所有的较少和javascript文件和一个配置对象,其中包含要观看的文件列表,它们是如何输出的等等。这是一个简单的示例:
var $ = require('gulp-load-plugins')();
var config = {
root: rootPath,
output: {
app: 'app',
vendor: 'vendor'
}, // ...
};
gulp.task('default', ['build', 'watch']);
gulp.task('build', ['clean', 'less:app', 'less:theme', 'css:vendor', 'js:app', 'js:vendor', 'rev', 'css:copyfonts']);
gulp.task('watch', function () {
var allFiles = config.styles.appSrc
.concat(config.styles.vendorSrc)
.concat(config.scripts.appSrc)
.concat(config.scripts.vendorSrc);
$.watch(allFiles, function () {
gulp.start('default');
});
});
gulp.task('watch:gulp', function () {
var p;
gulp.watch('gulpfile.js', spawnUpdatedGulp);
spawnUpdatedGulp();
function spawnUpdatedGulp() {
if (p) {
p.kill();
}
p = spawn('gulp', ['default', '--color'], { stdio: 'inherit' });
}
});
// .. other build tasks ..
上面的代码显示了我如何尝试接受的答案: How can Gulp be restarted upon each Gulpfile change?
然而,它有一个重大问题。当我运行watch:gulp
时,它运行构建就好了,一切都很棒。 config.output.app
变量是应用程序特定的css和js文件的命名方式,所以我的测试用例是:
gulp:watch
,检查css输出是否根据config.output.app
config.output.app
,然后再次执行第1步由于文件上有多个观察者,第3步充满了权限错误,而且只会越多,我重复步骤1和2. Visual Studio甚至会冻结。
我还没有办法清理旧观察者。我试图像这样手动杀死它们:
var appFileWatcher;
gulp.task('watch', function () {
var allFiles = config.styles.appSrc
.concat(config.styles.vendorSrc)
.concat(config.scripts.appSrc)
.concat(config.scripts.vendorSrc);
appFileWatcher = $.watch(allFiles, function () {
gulp.start('default');
});
});
gulp.task('watch:gulp', function () {
var p;
var gulpWatcher = $.watch('gulpfile.js', spawnUpdatedGulp);
spawnUpdatedGulp();
function spawnUpdatedGulp() {
if (p) {
p.kill();
}
if (appFileWatcher) {
appFileWatcher.unwatch();
}
gulpWatcher.unwatch();
p = spawn('gulp', ['default', '--color'], { stdio: 'inherit' });
}
});
这也行不通。当我执行相同的测试用例时,我仍然会让多个观察者尝试执行构建。
如何在产生新的吞咽过程后杀死那些留在那里的观察者?