【问题标题】:Run JSHint for a single file in Grunt在 Grunt 中为单个文件运行 JSHint
【发布时间】:2013-06-16 01:28:23
【问题描述】:

我在 Grunt 中有多个子任务(src、lib 和 test)的 JSHint 设置,效果很好。但是,由于我们刚刚开始使用此设置,因此我们的许多源文件中存在很多错误。

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

在一次处理一个文件时,是否可以重新对单个文件进行 lint?

$ 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" ]
    }
}

原因是srclib 使用一个.jshint,而test 使用一个不同的,它指定用于测试的所有全局变量,例如断言。我可以结合srclib,但是我可以覆盖test 的JSHint 配置文件吗?

【问题讨论】:

  • 很多 IDE(甚至像 Sublime Text 这样的文本编辑器)都有插入 jshint 的方法。对于单个文件,这可能是更好的方法吗?
  • @explunit - 我们中的许多人都使用 NetBeans,虽然有一个 JSLint plugin,但需要努力教它使用 JSHint 和我们的 .jshint 配置文件。我更喜欢 Grunt 中的解决方案,这样它就可以解决所有情况。
  • @explunit - 我确实找到了fork that use JSHint,但如果有的话,我仍然想要一个 Grunt 解决方案。

标签: gruntjs jshint


【解决方案1】:

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);
});

【讨论】:

  • 我现在要试试这个,因为它让我更接近,但是有没有办法在基于触发哪个监视子任务的事件中覆盖更多文件路径?有关监视子任务的设置方式和原因,请参阅我的编辑。
  • 当然,您可以在配置中获取和设置所有内容。设置grunt.config.get/grunt.config.set
  • 是的,但我需要根据触发的监视子任务(即编辑了哪个文件)来更改配置。我在修改后的文件的名称中查找srctest,这一切都很好,直到有人编写名称中带有“test”的源代码,反之亦然。
  • 我不明白您如何使用 grunt-contrib-watch 或 grunt 本身来做到这一点,抱歉。我认为你需要编写代码。我会尝试使用grunt.file.expand/expandMapping 之类的东西,看看你的文件路径是否包含在那个“扩展”数组中(也许你必须切掉文件的扩展名)
  • spawn: true 是否有此功能或类似功能?
【解决方案2】:

由于上面的答案并不是我所期待或寻找的,我想提供这个答案……

你可以像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))
        }
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多