更改gulpfile.js后重新启动gulp

时间:2016-01-21 18:21:28

标签: node.js gulp gulp-watch

当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文件的命名方式,所以我的测试用例是:

  1. 运行gulp:watch,检查css输出是否根据config.output.app
  2. 命名
  3. 更改config.output.app,然后再次执行第1步
  4. 保存正在观看的任何随机javascript文件,看看它是否正确构建
  5. 由于文件上有多个观察者,第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' });
        }
    });
    

    这也行不通。当我执行相同的测试用例时,我仍然会让多个观察者尝试执行构建。

    如何在产生新的吞咽过程后杀死那些留在那里的观察者?

0 个答案:

没有答案