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' из списка файлов, которые нужно пометить, чтобы избежать этого.

Другие вопросы по тегам