4

作为构建过程的一部分,我们运行一个 Grunt 任务,如下所示:

grunt release -r 3.9

与选项一起传递的版本号-r用于标记版本的各个部分。

问题出现在以零结尾的版本——例如 3.10。Grunt 将其视为一个数字,去掉尾随的零并认为这是 3.1 版。

这是一个演示问题的简单 Gruntfile:

module.exports = function(grunt) {
  grunt.registerTask('default', 'Release preparation', function () {
    var rel = grunt.option("r").toString();

    grunt.log.writeln("Release data type:" + typeof rel);
    grunt.log.writeln("release (" + rel + ")");
  });
};

这是你得到的:

$ grunt -r 3.10
Running "default" task
Release data type:string
release (3.1)

Done, without errors.

toString()其适当地转换为字符串,但损坏已经造成。尾随零消失了。

有什么办法吗?

4

1 回答 1

8

不幸的是,这种行为似乎是设计使然,因为 grunt-cli 使用nopt模块进行命令行解析。请参阅此处的代码,关键是:

return nopt(exports.known, exports.aliases, process.argv, 2);

这就是nopt 关于类型的内容(强调我的):

在解析未知字段时,“true”、“false”和“null”将被解释为它们的 JavaScript 等效项,而数值将被解释为一个数字。

一些解决方法可能是:

  1. 在命令行上使用类似的东西grunt release -r "v3.10",并在你的 grunt 代码中去掉“v”
  2. 再次阅读process.argv您的 grunt 代码并将其传递给您选择的选项解析器
于 2013-09-10T16:42:54.717 回答