Gulp 狼吞虎咽的守望与野精灵的冲突

Gulp 狼吞虎咽的守望与野精灵的冲突,gulp,nodemon,Gulp,Nodemon,简而言之:最近开始使用Gulp(从Grunt转换),我尝试对SASS/JS/HTML使用Gulp的默认监视任务(不是npm的Gulp监视)和Gulp nodemon(从npm)在发生更改时重新启动Express服务器。只运行gulpwatch时,工作正常;当运行gulpserver(对于nodemon)时,工作正常。但是,同时使用这两种方法(如下面默认任务的配置所示)时,watch工具无法工作。任务正在运行,在CLI上gulp显示监视任务的“开始”和“完成”,但文件不会更新 相关任务配置: Co

简而言之:最近开始使用Gulp(从Grunt转换),我尝试对SASS/JS/HTML使用Gulp的默认监视任务(不是npm的Gulp监视)和Gulp nodemon(从npm)在发生更改时重新启动Express服务器。只运行
gulpwatch
时,工作正常;当运行
gulpserver
(对于nodemon)时,工作正常。但是,同时使用这两种方法(如下面默认任务的配置所示)时,watch工具无法工作。任务正在运行,在CLI上gulp显示监视任务的“开始”和“完成”,但文件不会更新

相关任务配置:

Concat javascript:

    gulp.task('js:app', function(){
        return gulp.src([
            pathSource('js/application/modules/**/*.js'),
            pathSource('js/application/_main.js')
        ])
        .pipe(concat('application.js'))
        .pipe(gulp.dest('./build/assets/js')).on('error', utils.log);
    });
    gulp.task('express', function(){
        return nodemon({script:'server.js', ext:'js', cwd: __dirname + '/express', legacyWatch: true})
        .on('restart', function(){
            //gulp.run('watch'); // doesn't work :(
        });
});
    gulp.task('default', ['watch', 'express']);
Nodemon,更改后重新启动express应用程序:

    gulp.task('js:app', function(){
        return gulp.src([
            pathSource('js/application/modules/**/*.js'),
            pathSource('js/application/_main.js')
        ])
        .pipe(concat('application.js'))
        .pipe(gulp.dest('./build/assets/js')).on('error', utils.log);
    });
    gulp.task('express', function(){
        return nodemon({script:'server.js', ext:'js', cwd: __dirname + '/express', legacyWatch: true})
        .on('restart', function(){
            //gulp.run('watch'); // doesn't work :(
        });
});
    gulp.task('default', ['watch', 'express']);
观察javascript更改,并运行js:app进行concat'ing。

    gulp.task('watch', function(){
      gulp.watch(pathSource('js/application/**/*.js'), ['js:app']);
    });
要同时初始化gulp watch和nodemon的默认任务:

    gulp.task('js:app', function(){
        return gulp.src([
            pathSource('js/application/modules/**/*.js'),
            pathSource('js/application/_main.js')
        ])
        .pipe(concat('application.js'))
        .pipe(gulp.dest('./build/assets/js')).on('error', utils.log);
    });
    gulp.task('express', function(){
        return nodemon({script:'server.js', ext:'js', cwd: __dirname + '/express', legacyWatch: true})
        .on('restart', function(){
            //gulp.run('watch'); // doesn't work :(
        });
});
    gulp.task('default', ['watch', 'express']);

如果有人有任何想法,请提前感谢

gulp.run
调用已经过,所以我会尝试另一种方法。既然您已经在用
大口喝了
,我建议您试一试好吗

根据gulp nodemon,您可以向其传递一系列要执行的任务:

更新:这里是完整的
gulpfile.js
文件以及一个工作示例

“严格使用”;
//主要依赖项和插件
var gulp=需要(“gulp”);
var jshint=require('gulp-jshint');
var concat=需要(“咕噜咕噜咕噜”);
var-uglify=需要('gulp-uglify');
var rename=require('gulp-rename');
var nodemon=require('gulp-nodemon');
var资产='assets/js/***.js';
var publicDir='public/javascripts';
//皮棉任务
吞咽任务('lint',函数(){
返回gulp.src(资产)
.pipe(jshint())
.pipe(jshint.reporter(“jshint-style”);
});
//连接并缩小所有JS文件
gulp.task('scripts',function(){
返回gulp.src(资产)
.pipe(concat('global.js'))
.管道(大口目的地(公共目的地))
.pipe(重命名('global.min.js'))
.管道(丑()
.管道(大口目的地(公共目的地));
});
//监视文件的更改
吞咽任务('watch',函数(){
狼吞虎咽的看(资产,['lint','scripts']);
});
吞咽任务('demon',函数(){
诺德蒙({
脚本:“server.js”,
分机:“js”,
环境:{
“节点环境”:“开发”
}
})
.on('start',['watch']))
.on('change',['watch']))
.on('restart',函数(){
console.log('restarted!');
});
});
//默认任务
吞咽任务('default',['demon']);
这样,您可以在nodemon启动时生成
watch
任务,并确保每当nodemon重新启动应用程序时,都会再次触发
watch
任务

编辑:似乎您应该调用on-
更改
,它将在
重新启动
事件触发器之前处理编译任务


编辑:似乎nodemon的
打开('change',callback)
已从其

FWIW中删除,似乎在gulp nodemon的配置中使用cwd参数实际上会将整个gulp cwd设置到该目录。这意味着将来的任务将在错误的目录中执行

当在我的前端服务器上运行gulp watch任务的同时在我的后端服务器上运行nodemon任务(在同一个gulpfile中)的时候,我遇到了这个问题,有一个竞争条件,如果首先执行nodemon命令,前端的东西实际上会构建到(Home)/后端/前端,而不是(Home)/前端,一切都会从那里开始


我发现在gulp nodemon上使用watch和script参数可以解决这个问题(尽管看起来nodemon仍然在关注我整个项目的变化,而不是构建的后端目录)。

gaston-我使用的设置实际上已经是w/gulp nodemon;但是,我没有将其配置为在发生更改时重新启动监视任务。我会试一试,让你知道。谢谢!所以我没能让它那样工作。让我困惑的是:如果我像这样运行nodemon任务:
gulp.task('demon',['watch'],function(){nodemon({…})})
,nodemon和watch任务都会在文件更改时执行并显示输出,但是watch任务的更改不会写入相应的文件。就像任务正在运行一样,但它不会将更改管道化到磁盘。@jiveTurkey我已经用完整的gulpfile更新了我的答案,并留下了一个工作列表。基本上,这将启动
nodemon
,并将其与
gulpwatch
任务链接,以监视文件更改。让我知道进展如何;)谢谢你的回答,加斯顿。这很有魅力,真的帮助了我!在我的gulpfile.js中,我删除了
.on('change',['watch'])
,因为
watch
任务运行了两次,一次是在更改之前,另一次是在服务器重新启动之后。@Gaston-thx再次获得帮助,不幸的是,上述方法没有解决问题(尽管它使我走上了正确的轨道:)。似乎独立运行“监视”任务或“节点门”任务都可以正常工作。但是,如果nodemon配置具有
{cwd:'something\u relative\u here'}
,这将影响监视任务使用的路径。您可能认为它们是完全隔离的,但由于某种原因,nodemon中的
cwd
属性将影响gulp.watch(…)配置中的路径。解决办法是使路径成为绝对路径。不理想。将在下面发布完整的解释。