Grunt - собирать только измененные файлы, используя grunt-newer
Я запускаю задачу Grunt, которая использует Concurrent для запуска Nodemon и Watch/Livereload. При загрузке по умолчанию я задерживаюсь и запускаю Concurrent. Я также хотел бы настроить часы для хранения отдельных файлов при изменении. В настоящее время все файлы помечаются при изменении любого файла.
Я изучил аналогичный вопрос на Stackru и решил использовать grunt-newer в качестве потенциального решения. В моей реализации ниже, однако, "новый" префикс, похоже, ничего не делает. Как я могу это исправить, чтобы помечались только измененные файлы?
module.exports = function(grunt) {
//load all dependencies
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concurrent: {
dev: {
options: {
logConcurrentOutput: true
},
tasks: ['watch', 'nodemon']
}
},
jshint: {
files: ['Gruntfile.js', 'client/src/*.js', 'server/**/*.js'],
options: {
'-W030': true,
'-W083': true,
globals: {
console: true,
module: true,
document: true
}
}
},
watch: {
all: {
files: ['<%= jshint.files %>'],
tasks: ['newer:jshint']
},
frontend: {
files: ['client/**/*.{css,js,html}'],
options: {
livereload: true
}
}
},
nodemon: {
dev: {
options: {
file: 'server/server.js',
watchedFolders: ['server']
}
}
}
});
grunt.registerTask('test', ['jshint']);
grunt.registerTask('default', ['jshint', 'concurrent']);
};
1 ответ
У меня была такая же проблема, и я наконец-то понял. Решение скрыто глубоко в документации и вводит в заблуждение spawn
вариант в примере кода: https://github.com/gruntjs/grunt-contrib-watch
Ваш конфигурационный файл должен оставаться таким же, как у вас в вопросе, но вам нужно добавить слушателя к событию наблюдения. Я рекомендую "надежный" вариант, который они предоставляют (модифицированный для вашей конфигурации конкретной задачи). Разместите этот код чуть выше звонка grunt.initConfig
и после тебя require
звонки.
var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
// Modified to point to jshint.files as per the task example in the question.
grunt.config('jshint.files', Object.keys(changedFiles));
changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
changedFiles[filepath] = action;
onChange();
});
Добавить nospawn
вариант к all
смотреть задание. Это то, что вводит в заблуждение в документации. Он упоминает, что он должен быть отключен, если вы хотите динамически изменять конфигурацию, но в основном не позволяет работать с более новыми, если он не установлен на true
:
watch: {
all: {
files: ['<%= jshint.files %>'],
tasks: ['newer:jshint'],
options: {
nospawn: true,
}
},
...
ПРИМЕЧАНИЕ. Если вы изменяете файл grunt во время его работы, он будет связывать все файлы, не зная, почему он это делает, но затем он застревает и просто будет поминать все для всех внесенных вами изменений. Я просто вынул файл 'gruntfile.js' из списка файлов, которые нужно пометить, чтобы избежать этого.