3

コードの臭いを防ぐためにgulpとjscsを使用しようとしています。また、watch を使用して、変更が加えられるたびにこれが行われるようにしたいと考えています。私が直面している問題は、jscs が監視されているソース ファイルを変更することです。これにより、gulp はファイルを変更する jscs の無限ループに入り、変更を確認して jscs を何度も何度も起動するのを監視します ...

const gulp = require('gulp');

gulp.task('lint', function() {
    return gulp.src('/src/**/*.js')
        .pipe(jscs({
            fix: true
        }))
        .pipe(jscs.reporter())
        .pipe(gulp.dest('/src'));
});

gulp.task('watch', function() {
    gulp.watch('/src/**/*.js', ['lint']);
});
4

1 に答える 1

6

一般に、gulp タスクからソース ファイルをオーバーライドするのはお勧めできません。これらのファイルが開いているエディタ/IDE は、それを適切に処理する場合としない場合があります。一般的には、ファイルを別のdistフォルダーに書き込むことをお勧めします。

ここで考えられる解決策は2つあります。

解決策 1

プラグインの 2 回目の実行とファイルの再書き込みを停止してgulp-jscs、実行中の無限ループを防ぐ必要があります。これを達成するには、タスクに追加するだけgulp-cachedですlint

var cache = require('gulp-cached');

gulp.task('lint', function() {
  return gulp.src('/src/**/*.js')
    .pipe(cache('lint'))
    .pipe(jscs({
        fix: true
    }))
    .pipe(cache('lint'))
    .pipe(jscs.reporter())
    .pipe(gulp.dest('/src'));
});

1 つ目cache()は、最後の呼び出し以降に変更されたディスク上のファイルのみlintが渡されるようにします。2 つ目cache()は、実際に修正されたファイルのみがjscs()最初にディスクに書き込まれるようにします。

このソリューションの欠点は、lintタスクがまだ 2 回実行されていることです。2 回目の実行では、ファイルは実際には lint されていないため、これは大した問題ではありません。gulp-cacheそれを防ぎます。しかし、絶対に一度だけ実行したい場合は、lint別の方法があります。

解決策 2

まず、ビルトインの代わりにgulp-watchプラグインgulp.watch()を使用する必要があります(これは、 の代わりに優れたchokidarライブラリを使用するためですgaze)。

次に、簡単なpausableWatch()関数を自分で作成し、それをwatchタスクで使用できます。

var watch = require('gulp-watch');

function pausableWatch(watchedFiles, tasks) {
  var watcher = watch(watchedFiles, function() {
    watcher.close();
    gulp.start(tasks, function() {
      pausableWatch(watchedFiles, tasks);
    });
  });
}

gulp.task('watch', function() {
  pausableWatch('/src/**/*.js', ['lint']);
});

上記では、タスクが開始watcherされる前に停止されます。lintしたがって 、タスク.js中に書き込まれたファイルは、 . タスクが終了すると、が再び起動します。lintwatcherlintwatcher

このソリューションの欠点は.js、タスクの実行中にファイルを保存するlintと、その変更が によって取得されないことですwatcher(タスクが停止しているため)。タスクが終了した後 (が再び開始されたとき)に、.jsファイルを保存する必要があります。lintwatcher

于 2016-06-03T07:01:48.940 に答える