Grunt使用模板和lodash省略设置任务选项

时间:2014-01-14 04:15:08

标签: gruntjs

我的Gruntfile中有一个与此类似的jshint任务:

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

1 个答案:

答案 0 :(得分: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 } }
  })

<强>参考