14

手短に:最近Gulpの使用を開始し(Gruntから変換)、SASS/JS/HTML用のGulpのデフォルトの監視タスク(npmからのgulp-watchではない)と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、エクスプレス アプリへの変更で再起動:

    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 ウォッチと nodemon を同時に初期化するためのデフォルト タスク:

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

誰かに何かアイデアがあれば、事前に感謝します!

4

2 に答える 2

16

gulp.run呼び出しは廃止されたので、別のアプローチを試してみます。あなたはすでに を使っているのでgulpgulp-nodemonを試してみませんか?

gulp-nodemon documentationに従って、実行するタスクの配列を渡すことができます:

更新: githubgulpfile.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']);

このようにして、watchnodemon の開始時にタスクを生成し、 watchnodemon がアプリを再起動するたびにタスクが再びトリガーされるようにします。

EDIT :イベントがトリガーされる前コンパイルタスクを処理するgulp-nodemon から on-event を呼び出す必要があるようです。change restart

編集: nodemonがAPIon('change', callback)から削除されたようです

于 2014-05-13T22:35:13.330 に答える
4

FWIW、gulp-nodemon の構成で cwd パラメータを使用すると、実際には gulp cwd 全体がそのディレクトリに設定されるようです。これは、将来のタスクが間違ったディレクトリで実行されることを意味します。

フロントエンド サーバーで gulp 監視タスクを実行しているときに (同じ gulpfile で) バックエンド サーバーで nodemon タスクを同時に実行すると、この問題が発生しました。nodemon コマンドが最初に実行された場合、フロントエンドのものが実際に(Home)/frontend ではなく (Home)/backend/frontend にビルドすると、そこからすべてが洋ナシ型になります。

gulp-nodemon で watch および script パラメータを使用すると、これを回避できることがわかりました (ただし、nodemon は、構築されたバックエンド ディレクトリではなく、プロジェクト全体の変更を監視しているように見えます)。

于 2014-08-14T00:27:23.703 に答える