2

如何在运行时在 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开关它就可以工作,使用时-E返回grunt.option()未定义。奇怪的是,新选项显示在--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,然后重新解析选项对象。重新解析只需将此处的代码包装到一个在初始化时和 endof 时调用的方法中即可addOptions()

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

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

到目前为止我的回答

那我该怎么回答...

我上面的例子是正确和合适的,只要一个人可以接受长选项。

一旦我有更多信息,我会更新这个问题。:)

4

2 回答 2

3

也许我遗漏了一些东西,但是您需要对两者进行测试:

var environment = grunt.option("E") || grunt.option("environment");
于 2012-12-30T20:42:42.670 回答
0

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

我用nopt-grunt解决了这个问题

来自插件作者:

咕噜棒极了。Grunt 对使用附加命令行选项的支持并不出色。当前的文档具有误导性,因为它们提供了使用布尔标志和带有值的选项的示例,但它们并没有告诉您它仅适用于单个选项。尝试并使用多个选项,事情很快就会崩溃。

*** 我之前发布过这个,但是我在命令行参数上玩得很糟糕,当你用谷歌搜索“grunt 中的命令行参数”时,这个排名非常高。这绝对值得一试

于 2015-01-09T17:16:48.333 回答