Я пытаюсь повторно запустить сборку gulp при изменении gulpfile.js, но у меня возникли проблемы с методом, к которому меня привели все мои исследования.
У меня есть один наблюдатель для всех моих файлов less и 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 ..
Приведенный выше код показывает, как я попробовал принятый ответ на этот вопрос: Как можно ли перезапускать Gulp при каждом изменении Gulpfile?
Однако у него есть серьезная проблема. Когда я запускаю watch:gulp
, он отлично запускает сборку, и все отлично. Переменная config.output.app
— это то, как называются файлы css и js, специфичные для приложения, поэтому мой тестовый пример был таким:
- запустите
gulp:watch
, убедитесь, что вывод css назван в соответствии сconfig.output.app
- измените
config.output.app
и снова выполните шаг №1 - сохраните любой случайный файл javascript, который он просматривает, и посмотрите, правильно ли он строится
Шаг 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' });
}
});
Это также не работает. Я все еще получаю несколько наблюдателей, пытающихся выполнить сборку, когда я выполняю тот же тестовый пример.
Как мне убить тех наблюдателей, которые остаются после запуска нового процесса gulp?
server.js
илиapp.js
, но там не было примеров того, что будет содержать этот файл. У меня нет экспресс-приложения, поэтому мне не нужно перезагружать веб-приложение. Кажется излишним создавать собственное приложение, чтобы просто перезапустить gulp. Если бы я мог поставить «gulpfile.js» вместо server или app.js, это имело бы смысл для меня, но я нигде не видел этого в качестве примера. - person DerekMT12   schedule 21.01.2016