Перезапуск gulp после изменений в gulpfile.js

Я пытаюсь повторно запустить сборку 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, специфичные для приложения, поэтому мой тестовый пример был таким:

  1. запустите gulp:watch, убедитесь, что вывод css назван в соответствии с config.output.app
  2. измените config.output.app и снова выполните шаг №1
  3. сохраните любой случайный файл 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?


person DerekMT12    schedule 21.01.2016    source источник
comment
Я использую одного наблюдателя, который управляет всем этим с помощью nodemon.   -  person rmjoia    schedule 21.01.2016
comment
Я заглянул в gulp-nodemon, но все примеры, которые я видел, ссылались на server.js или app.js, но там не было примеров того, что будет содержать этот файл. У меня нет экспресс-приложения, поэтому мне не нужно перезагружать веб-приложение. Кажется излишним создавать собственное приложение, чтобы просто перезапустить gulp. Если бы я мог поставить «gulpfile.js» вместо server или app.js, это имело бы смысл для меня, но я нигде не видел этого в качестве примера.   -  person DerekMT12    schedule 21.01.2016