Запустите JSHint для одного файла в Grunt

У меня есть установка JSHint с несколькими подзадачами (src, lib и test) в Grunt, которая отлично работает. Однако, поскольку мы только начинаем использовать эту настройку, во многих наших исходных файлах обнаруживается много ошибок.

$ grunt jshint:src
... lots of errors ...

Можно ли, работая с одним файлом за раз, повторно запечатать этот единственный файл?

$ grunt jshint:src:one.js
... only errors from one.js ...

Обновить

Одна из сложностей заключается в том, что задача наблюдения также имеет несколько подзадач для запуска различных задач в зависимости от того, какой тип файла редактируется.

watch: {
    src: {
        files: [ SRC_DIR + "hgm*.js" ],
        tasks: [ "jshint:src", "test" ]
    },
    lib: {
        files: [ "lib/hgm-test-setup.js", "lib/hgm.loader.js" ],
        tasks: [ "jshint:lib", "test" ]
    },
    test: {
        files: [ "tests/**/*.js" ],
        tasks: [ "jshint:test", "test" ]
    }
}

Причина этого в том, что src и lib используют один .jshint, а test использует другой, который определяет все глобальные переменные, используемые для тестирования, такие как утверждения. Я могу комбинировать src и lib, но могу ли я переопределить файл конфигурации JSHint для test?


person David Harkness    schedule 16.06.2013    source источник
comment
во многих IDE (и даже в текстовых редакторах, таких как Sublime Text) есть способ подключить jshint. Может быть, это лучший подход для одного файла?   -  person explunit    schedule 16.06.2013
comment
@explunit - многие из нас используют NetBeans, и хотя есть плагин JSLint, потребуется работа, чтобы научить его использовать JSHint и наши .jshint файлы конфигурации. Я бы предпочел решение в Grunt, чтобы оно подходило ко всем ситуациям.   -  person David Harkness    schedule 16.06.2013
comment
@explunit - я нашел вилку, использующую JSHint, но мне все равно хотелось бы решение Grunt. если он есть.   -  person David Harkness    schedule 16.06.2013


Ответы (2)


grunt-contrib-watch-task предоставляет пример того, как настроить ваши задачи и использовать watch-event для линтинга только измененных файлов:

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
      options: {
        nospawn: true,
      },
    },
  },
  jshint: {
    all: ['lib/*.js'],
  },
});

// on watch events configure jshint:all to only run on changed file
grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], filepath);
});
person hereandnow78    schedule 16.06.2013
comment
Я собираюсь попробовать это сейчас, поскольку это приближает меня, но есть ли способ переопределить не только путь к файлу в событии, в зависимости от того, какая подзадача наблюдения была запущена? Смотрите мою правку, чтобы узнать, как настраиваются подзадачи часов и почему. - person David Harkness; 16.06.2013
comment
конечно, вы можете получить и установить все в своем конфиге. установите grunt.config.get / grunt.config.set - person hereandnow78; 17.06.2013
comment
Да, но мне нужно изменить конфигурацию в зависимости от того, какая подзадача наблюдения запущена, то есть какой файл был отредактирован. Я ищу src и test в имени измененного файла, и все хорошо, пока кто-нибудь не напишет источник с тестом в имени или наоборот. - person David Harkness; 17.06.2013
comment
я не понимаю, как вы можете сделать это с помощью grunt-contrib-watch или grunt сам, извините. Я думаю, вам нужно это закодировать. я бы попытался использовать что-то вроде grunt.file.expand / expandMapping и посмотрите, включен ли ваш путь к файлу в этот расширенный массив (возможно, вам придется вырезать внешнее имя файла) - person hereandnow78; 17.06.2013
comment
Есть ли какие-то возможности для использования этой или аналогичной функциональности с spawn: true? - person chemoish; 11.06.2015
comment
я не знаю, почему это не должно работать без установленной опции nospawn - person hereandnow78; 11.06.2015

Поскольку приведенный выше ответ на самом деле не то, что я ожидал или искал, я хотел бы предложить этот ответ ...

Вы можете вызвать его как grunt jshint-file:src/filename.js

grunt.registerTask('jshint-file',
        'Runs jshint on a file',
        function (filePath) {
            var reportFunc = require('jshint/src/reporters/unix').reporter
            var optionsString = grunt.file.read('.jshintrc')
            var options = JSON.parse(optionsString)
            jshint(grunt.file.read(filePath), options)
            errors = jshint.data().errors.map(function (error) {
                var record = {};
                record.file = filePath;
                record.error = error;
                return record;
            });
            console.log(reportFunc(errors))
        }
    )
person Clintm    schedule 18.12.2017