私はinitConfig
それにこのコードを持っています:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
options: {
spawn: false
},
coffee: {
files: [
'src/**/*.coffee'
],
tasks: ['coffee', 'coffeelint', 'concat', 'qunit']
},
...
coffee: {
glob_to_multiple: {
expand: true,
flatten: false,
cwd: '.',
src: ['src/**/*.coffee'],
ext: '.js'
}
},
...
grunt.event.on('watch', function (action, filepath) {
if (grunt.file.isMatch("**/*.coffee", filepath)) {
grunt.config(['coffee', 'glob_to_multiple', 'src'], filepath);
}
});
これは、変更された .coffee ファイルのみをコンパイルすることになっています。これはかなりうまくいきます。しかし、一度に複数を変更すると、次のように出力されることに気付きました。
Waiting...src\test\resources\app\js\FILE1.coffee
src\main\resources\app\js\FILE2.coffee
OK
>> File "src\test\resources\app\js\FILE1.coffee" changed.
>> File "src\main\resources\app\js\FILE2.coffee" changed.
Running "coffee:glob_to_multiple" (coffee) task
File src/main/resources/app/js/FILE2.js created.
...
ご覧のとおり、2 つのファイルを変更しましたが、「FILE2.js」でのみタスクを実行しています。どうすればこれを回避できますか? coffee:glob_to_multiple
どちらか一方だけでなく、FILE1 と FILE2 で実行する必要があります。
注:ドキュメントでこれを行う方法が説明されていると確信しています:
複数のファイルを同時に保存する場合は、より堅牢な方法を選択できます。
var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
grunt.config(['jshint', 'all'], Object.keys(changedFiles));
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
});
そのドキュメントに従って、コードに次の変更を加えました。
var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
grunt.config(['coffee', 'glob_to_multiple', 'src'], Object.keys(changedFiles));
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
if (grunt.file.isMatch("**/*.coffee", filepath)) {
changedFiles[filepath] = action;
onChange();
}
});
そして、物事はまさに私が望むように機能しました。 しかし、これがどのように機能するのかわかりません。誰かが私にそれを説明できますか?