Grunt - lint仅使用grunt-newer修改了文件

时间:2013-11-07 02:37:36

标签: gruntjs grunt-contrib-watch grunt-concurrent

我正在运行一个使用Concurrent来运行Nodemon和Watch / Livereload的Grunt任务。在默认加载时,我lint并启动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']);

};

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题并最终弄明白了。该解决方案深入隐藏在文档中,并且对代码示例中的spawn选项产生了误导:https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed

您的配置文件应与问题中的配置文件保持一致,但您需要为监视事件添加监听器。我推荐他们提供的“健壮”选项(根据您的特定任务配置进行修改)。将此代码放在grunt.initConfigrequire来电之后的电话上方。

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'来避免它。