Я столкнулся с аналогичным требованием, и решение, с которым я столкнулся, выглядит примерно следующим образом. Предположим, что структура проекта такова:
Gruntfile.js
package.json
src/
config.js
data.js
tasks/
customtask.js
Здесь каталог src
содержит данные, которые будут отслеживаться watch
, а определение пользовательской задачи хранится в tasks/customtask.js
. Для целей этого примера эта задача будет печатать только имена измененных файлов:
var fs = require('fs');
var path = require('path');
module.exports = function(grunt) {
grunt.registerMultiTask('customtask', function() {
var done = this.async();
if(!this.files){ done(); return; }
this.files[0].src.forEach(file_name => {
console.log(file_name);
});
done();
});
};
Теперь Gruntfile.js
выглядит так:
module.exports = function(grunt) {
const files = ['src/config.js', 'src/data.js'];
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
customtask: {
release: {
src: files
}
},
watch: {
data: {
files: files,
tasks: ['customtask:release']
},
options: {
spawn: false
}
}
});
grunt.loadTasks('tasks');
grunt.loadNpmTasks('grunt-contrib-watch');
var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
grunt.config('customtask.release.src', Object.keys(changedFiles));
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
});
grunt.registerTask('build', ['watch:data']);
};
здесь указывается, что:
- интересующие файлы
['src/config.js', 'src/data.js']
- что наш
customtask
в принципе работает с этими файлами (на случай, если он будет вызываться напрямую)
- что
watch
должен наблюдать за этими файлами и запускать customtask:release
всякий раз, когда что-то меняется
grunt.loadTasks('tasks')
загружает все "определения задач" из каталога tasks
, т.е. здесь только customtask
grunt.registerTask('build', ['watch:data'])
определяет "ярлык" для watch:data
Наконец, чтобы вызвать customtask
только для измененных файлов, в этом примере используется стратегия, используемая в документацию в разделе "Компиляция файлов по мере необходимости". Проще говоря, он собирает все измененные файлы в объект, ключи которого затем используются для изменения свойства src
объекта customtask
на лету.
Запуск grunt build
затем инициирует "часы". Если запустить в другом окне терминала, например touch src/*.js
, результат будет таким:
Running "watch:data" (watch) task
Waiting...
>> File "src/config.js" changed.
>> File "src/data.js" changed.
Running "customtask:release" (customtask) task
src/config.js
src/data.js
где последние две строки исходят из customtask
...
person
ewcz
schedule
19.12.2017