如果JSHint在监视任务期间失败,如何使Grunt构建失败?

时间:2016-10-13 21:12:07

标签: javascript gruntjs grunt-contrib-jshint

这似乎是一个基本问题,但我无法弄清楚如何去做。 This is how to do it in gulp

我希望在保存带有jshint错误的文件时使Grunt构建失败。输出表明jshint失败但Grunt仍然成功完成。

grunt.initConfig({
    watch: {
      js: {
        files: ['/scripts/{,**}/*.js'],
        tasks: ['newer:jshint:all']
      }
    }
})

我知道有grunt.fail但我怎么在这里使用它?

1 个答案:

答案 0 :(得分:2)

以下要点将通过CLI报告jshint错误,并且在保存.js文件时无法执行任何后续构建步骤。

您需要根据自己的要求进行调整:

目录结构:

project
│
├──package.json
│
├───scripts
│   │
│   └───test.js
│
├─── Gruntfile.js
│
└───node_modules
    │
    └─── ...

的package.json

{
  "name": "stack40031078",
  "version": "0.0.1",
  "description": "Answer to stack question 40031078",
  "author": "RobC",
  "license": "Apache-2.0",
  "devDependencies": {
    "grunt": "^1.0.1",
    "grunt-contrib-jshint": "^1.0.0",
    "grunt-contrib-watch": "^1.0.0",
    "grunt-newer": "^1.2.0"
  }
}

Gruntfile.js

module.exports = function (grunt) {

    grunt.initConfig({

        pkg: grunt.file.readJSON('package.json'),

        // VALIDATE JS
        jshint: {
            // Note we're using 'src:' instead of 'all:' below.
            files: {
                src: './scripts/{,**}/*.js'
            },
            options: {
                // Use your jshint config here or define them in
                // a separate .jshintrc file and set the flag to:
                //
                // jshintrc: true
                curly: true,
                eqeqeq: true,
                immed: true,
                latedef: true,
                newcap: true,
                noarg: true,
                sub: true,
                undef: true,
                boss: true,
                eqnull: true,
                browser: true,
                smarttabs: true,
                globals: {}
            }
        },

        // WATCH THE JS FILES
        watch: {
            js: {
                files: ['./scripts/{,**}/*.js'],
                // NOTE: we're not using 'newer:jshint:all' below, just 'newer:jshint'
                tasks: ['newer:jshint' /* <-- Add subsequent build tasks here. E.g. ,'concat' - A registered task can also be added. E.g. 'default' */]
            }
        }

    });

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

    grunt.registerTask('default', [

    ]);

};

test.js

console.log('Hello World');

var test = function() {
    return 'test';
};

测试演示要点

  1. cdproject目录
  2. 运行$ npm install
  3. 运行$ grunt watch
  4. 打开并对test.js进行简单编辑,(例如在文件末尾添加新行),然后保存更改。
  5. CLI报告错误如下:

        Running "jshint:files" (jshint) task
           ./scripts/test.js
              1 |console.log('Hello Universe');
                 ^ 'console' is not defined.
    
        >> 1 error in 1 file
        Warning: Task "jshint:files" failed. Use --force to continue.
    
        Aborted due to warnings.
        Completed in 0.965s at Fri Oct 14 2016 10:22:59 GMT+0100 (BST) - Waiting...
    

    注意:

    tasks对象的watch.js数组中指定的任何后续构建任务(例如,concat中注释的Gruntfile.js)将不会使用此方法调用gist jshint任务失败(......当然没有定义concat任务!)。

    但是,当JavaScript文件成功传递jshint任务时,将调用tasks对象的watch.js数组中定义的任何后续构建任务。

    我希望这有帮助!