Grunt — анализировать только измененные файлы с помощью grunt-newer

Я запускаю задачу Grunt, которая использует Concurrent для запуска Nodemon и Watch/Livereload. При загрузке по умолчанию я анализирую и запускаю Concurrent. Я также хотел бы настроить Watch для проверки отдельных файлов при изменении. В настоящее время все файлы анализируются при изменении любого файла.

Я изучил аналогичный вопрос на StackOverflow и решил использовать 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']);

};

person arami    schedule 07.11.2013    source источник


Ответы (1)


У меня была такая же проблема, и я, наконец, понял это. Решение скрыто глубоко в документации и очень вводит в заблуждение с опцией spawn в примере кода: https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed

Ваш файл конфигурации должен оставаться таким же, как и в вашем вопросе, но вам нужно добавить прослушиватель к событию наблюдения. Я рекомендую «надежный» вариант, который они предоставляют (модифицированный для вашей конкретной конфигурации задачи). Поместите этот код непосредственно над вызовом 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' из списка файлов, которые следует проверить, чтобы избежать этого.

person BrutalDev    schedule 15.11.2013
comment
Идеально! Спасибо за измененный ответ. - person arami; 16.11.2013