Running grunt-contrib-jshint only on recently modified files

橙三吉。 提交于 2019-12-04 09:08:21
explunit

A couple options:

1 - You can use a custom filter function to filter the list of files returned by your jshint file pattern. Something like this:

module.exports = function(grunt) {
  var fs = require('fs');

  var myLibsPattern = ['./mylibs/**/*.js'];

  // on linux, at least, ctime is not retained after subsequent modifications,
  // so find the date/time of the earliest-created file matching the filter pattern
  var creationTimes = grunt.file.expand( myLibsPattern ).map(function(f) { return new Date(fs.lstatSync(f).ctime).getTime() });
  var earliestCreationTime = Math.min.apply(Math, creationTimes);
  // hack: allow for 3 minutes to check out from repo
  var filterSince = (new Date(earliestCreationTime)).getTime() + (3 * 60 * 1000);

  grunt.initConfig({
    options: {
      eqeqeq: true,
      eqnull: true
    },
    jshint: {
      sincecheckout: {
        src: myLibsPattern,
        // filter based on whether it's newer than our repo creation time
        filter: function(filepath) {
          return (fs.lstatSync(filepath).mtime > filterSince);
        },
      },
    },
  });

  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.registerTask('default', ['jshint']);
};

2 - use the grunt-contrib-watch plugin to detect when files are changing. Then you can read the list of files from the event, as described in this comment by Kyle Robinson Young ("shama"):

grunt.initConfig({
  watch: {
    all: {
      files: ['<%= jshint.all.src %>'],
      tasks: ['jshint'],
      options: { nospawn: true }
    }
  },
  jshint: { all: { src: ['Gruntfile.js', 'lib/**/*.js'] } }
});
// On watch events, inject only the changed files into the config
grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all', 'src'], [filepath]);
});

This doesn't exactly meet your requirements since it depends on having the watch running as soon as you start modifying files, but it might fit better with the overall Grunt approach.

See also this question but beware some of it relates to older version of Grunt and to coffeescript.

UPDATE: there's now a grunt-newer plugin which handles all this in a more elegant way

Use grunt-newer for this. It is especially made to configure Grunt tasks to run with newer files only.

Example:

grunt.initConfig({
  jshint: {
    options: {
      jshintrc: '.jshintrc'
    },
    all: {
      src: 'src/**/*.js'
    }
  }
});

grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-newer');

grunt.registerTask('lint', ['newer:jshint:all']);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!