将grunt命令行选项解释为字符串

时间:2013-09-10 15:42:53

标签: javascript node.js gruntjs

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

grunt release -r 3.9

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

问题出现在以零结尾的版本中 - 例如3.10。 Grunt将此视为一个数字,删除尾随零,并认为这是3.1版本。

这是一个简单的Grunt文件,它演示了这个问题:

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()将其恰当地转换为字符串,但损坏已经完成。尾随零消失了。

有什么方法吗?

1 个答案:

答案 0 :(得分:8)

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

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

这是nopt has to say about types(强调我的):

  

解析未知字段时,“true”,“false”和“null”将被解释为其JavaScript等价物,数值将被解释为数字。

可能有几种解决方法:

  1. 在命令行中使用类似grunt release -r "v3.10"的内容,并删除代码中的“v”
  2. 在您的grunt代码中再次阅读process.argv并将其传递到您选择的选项解析器