14

不足之处:最近开始使用 Gulp(从 Grunt 转换),并尝试同时使用 Gulp 的默认监视任务(不是来自 npm 的 gulp-watch)用于 SASS/JS/HTML 和 gulp-nodemon(来自 npm)来重新启动 Express服务器根据更改。运行时gulp watch,它工作正常;并且在运行gulp server(对于nodemon)时可以正常工作。但是,同时使用两者(在默认任务的配置中显示如下),手表的东西不起作用。该任务正在运行,并且在 CLI gulp 上显示监视任务的“正在启动”和“已完成”,但文件不会更新。

相关任务配置:

连接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);
    });

Nodemon,重新启动 express 应用程序的更改:

    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 :(
        });
});

观察 javascript 的变化,并运行 js:app 进行连接。

    gulp.task('watch', function(){
      gulp.watch(pathSource('js/application/**/*.js'), ['js:app']);
    });

默认任务,同时初始化 gulp watch 和 nodemon:

    gulp.task('default', ['watch', 'express']);

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

4

2 回答 2

16

gulp.run电话已被弃用,所以我会尝试不同的方法。既然你已经在使用了gulp,我可以建议你试试gulp-nodemon吗?

根据 gulp-nodemon文档,您可以将一组任务传递给它以执行:

更新:这是完整文件,以及github 上gulpfile.js的工作示例。

'use strict';

// Main dependencies and plugins
var gulp = require('gulp');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var nodemon = require('gulp-nodemon');

var assets = 'assets/js/**/*.js';
var publicDir = 'public/javascripts';

// Lint Task
gulp.task('lint', function () {
  return gulp.src(assets)
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'));
});

// Concatenate and minify all JS files
gulp.task('scripts', function () {
  return gulp.src(assets)
    .pipe(concat('global.js'))
    .pipe(gulp.dest(publicDir))
    .pipe(rename('global.min.js'))
    .pipe(uglify())
    .pipe(gulp.dest(publicDir));
});

// Watch Files For Changes
gulp.task('watch', function () {
  gulp.watch(assets, ['lint', 'scripts']);
});

gulp.task('demon', function () {
  nodemon({
    script: 'server.js',
    ext: 'js',
    env: {
      'NODE_ENV': 'development'
    }
  })
    .on('start', ['watch'])
    .on('change', ['watch'])
    .on('restart', function () {
      console.log('restarted!');
    });
});

// Default Task
gulp.task('default', ['demon']);

这样,您watch在 nodemon 启动时生成任务,并确保watch在 nodemon 重新启动您的应用程序时再次触发该任务。

编辑似乎您应该change 从 gulp-nodemon 调用 on- 事件,它将在事件触发之前处理编译任务。restart

编辑:似乎 nodemonon('change', callback)已从他们的API中删除

于 2014-05-13T22:35:13.330 回答
4

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

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

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

于 2014-08-14T00:27:23.703 回答