Grunt文件:如何在运行时添加命令行选项? (Grunt 0.3.15+)

时间:2012-12-27 17:03:04

标签: command-line-interface command-line-arguments gruntjs

如何在运行时在Grunt文件中添加和评估命令行选项?

我试过这个:

module.exports = function(grunt) {
  var cli = grunt.cli;

  cli.optlist["environment"] = {
    "short": "E",
    info: "Build environment",
    type: String
  };

  // This only outputs "environment=abc" if Grunt was called with
  //   --environment, with -E it returns "environment=undefined"
  console.log("environment=" + grunt.option("environment"));

  grunt.initConfig({ ... });

...
}

只要我使用--environment开关,只要我使用-Egrunt.option()返回undefined,它就会正常工作。奇怪的是,新选项显示在--help屏幕中。

显然,选项对象仅初始化一次:https://github.com/gruntjs/grunt/blob/0.3-stable/lib/grunt/cli.js#L105。我无法弄清楚为什么在使用长开关选项时会对新选项进行评估。

我认为在添加新选项后我应该重新解析选项。我可以再次调用grunt.tasks(),但这不起作用,正如我所料。

错误的方式。什么是更好的方式?

创建Grunt帮助器或任务时,我会遇到相同的限制吗?这是一个应该在Grunt内部改变的一般限制吗?

这个问题与:

有关
  • Grunt 0.3.15+(据我所见,它也适用于0.4.x)
  • 节点0.6.18

修改

我现在对Grunt进行了更多的逆向设计并试图改变Grunt本身以允许自己在运行时添加选项。

我想跳过写Grunt中的变化,因为它太多而且误导了。让我来描述总结的变化。

到目前为止,这是我的Grunt文件:

grunt.addOptions({
    "environment": {
            "short": "L",
            info: "Build environment",
            type: String
    }
});

addOptions()尝试将传递的选项添加到optlist对象,然后重新解析选项对象。只需将the code here包装到初始化时调用的方法addOptions()结束时重新解析。

到目前为止,我的实施并未解决问题。由于Grunt的内部依赖结构不允许加载和解析Grunt文件(需要解析的命令行选项),然后再进一步初始化命令行选项config(这是我的方法),因此我必须在Grunt中进行太多更改。

我认为应该与GruHub的Grunt开发人员讨论为Grunt文件提供自定义选项。

到目前为止我的答案

那我该怎么回答......

上面的例子是正确和合适的,只要可以使用长选项。

我会在收到更多信息后立即更新此问题。 :)

2 个答案:

答案 0 :(得分:3)

也许我错过了什么,但你需要对两者进行测试:

var environment = grunt.option("E") || grunt.option("environment");

答案 1 :(得分:0)

值得一提的是,随着您要使用的命令行参数的数量增加,与grunt内部使用的某些参数发生冲突。

我用nopt-grunt

解决了这个问题

来自插件作者:

  

Grunt太棒了。 Grunt对使用其他命令行选项的支持并不令人敬畏。当前的文档具有误导性,因为它们给出了使用布尔标志和带有值的选项的示例,但是它们并没有告诉您它只能使用单个选项。尝试并使用多个选项,事情很快就会崩溃。

***我之前发布了这个,但是我在命令行参数上遇到了这么糟糕的时间,当你在grunt"中使用google"命令行参数时这个排名很高。这绝对值得一试