2014-01-14 18 views
1

我在Gruntfile一個jshint任務類似於此任務選項:咕嚕設置使用模板和lodash省略

jshint: { 
    options: { 
     curly: true, 
     ... 
     jquery: true, 
     globals: { 
      console: true, 
      Foo: true, 
      Bar: true 
     }    
    }, 
    dev : ['Gruntfile.js', '<%= meta.jsDevFiles %>'], 
    build : { 
     options: { 
      globals: {Foo: true, Bar: true} 
     }, 
     src: ['Gruntfile.js', '<%= meta.jsDevFiles %>'] 
    } 
} 

將會有全局的無限量,我覺得開發期間有可用的控制檯方便但不希望它在構建過程中可用。我可以將所有全局變量添加兩次,但這會非常低效,容易出錯。所以我進口lodash,並試圖這樣:

build: { 
    options: { 
     globals: '<% _.omit(jshint.options.globals, \'console\') %>' 
    }, 
    ... 
} 

這應該,理論上,只是從選項中刪除控制檯的鍵,但它不適合我。經過一些試驗和錯誤,我發現這將工作:

build : { 
    options: { 
     globals: "<% jshint.build.options.globals = _.omit(jshint.options.globals, 'console'); %>" 
    }, 
    ... 
} 

有關這似乎是錯誤的,即使它工作。有沒有更好的方式去做我想做的事情?我工作的另一個版本是將globals選項存儲爲一個變量,然後在開發和構建任務中使用它,但是將選項從任務中分離出來,並且爲了更好地使用Grunt和模板,我很好奇如何讓它工作。

module.exports = function(grunt) { 
    var _ = require('lodash'); 
    var jshintGlobs = { 
     console: true, 
     Foo: true, 
     Bar: true 
    } 

    jshint: { 
     options: { 
      ... 
      globals: jshintGlobs 
     } 
     build: { 
      options: { 
       globals: _.omit(jshintGlobs, 'console'); 
      } 
     } 
    } 
} 

回答

0

使用的package.json文件來存儲全局:

devDependencies: 
     { 
     globals: 
     { 
     Foo: true, 
     Bar: true 
     } 
     } 

然後引用他們在開發任務:

var pkg = grunt.file.readJSON('package.json'); 
var consoleSetting = {"console":true}; 
var defaultGlobals = pkg.devDependencies.globals; 
var devGlobals = (JSON.stringify(defaultGlobals) + JSON.stringify(consoleSetting)).replace("}{", ","); 

grunt.initConfig 
    ({ 
    jshint: {options: { globals: JSON.parse(devGlobals) } }, 
    build: {options: { globals: pkg.devDependencies.globals } } 
    }) 

參考