Node.js optimist模块 - 将flag之后的所有参数分配给flag

时间:2012-09-14 00:17:52

标签: node.js

我对node.js使用optimist,并希望像这样解析输入:

$ command some args -m this is the message

进入这个

{argv:{_:['some','args'],m:'this is the message'}}

这对乐观主义者来说可能吗? 这一般是可能的吗?

2 个答案:

答案 0 :(得分:2)

一般来说,shell负责对包含空格的参数进行分组,而不是参数解析器。这通常是由用户引用多字参数(在Unix类型的shell中使用单引号或双引号,在Windows中仅识别双引号)来完成的。

在Optimist中你可以做类似的事情:

var argv=require('optimist').argv;
if (argv.m) {
  argv.m=argv.m+' '+argv._.join(' ');
}

如果 -m是最后一个参数,它将按预期工作。但是,如果您执行类似command ... -m hello there -q now here的操作,argv.m最终会“在这里问好”,这可能不是您想要的。

答案 1 :(得分:0)

我最终做了这个,这适用于我的用例:

#!/usr/bin/env coffee

args = process.argv

o = {_:[],$0:[]}
flags = {s:'state',m:'message',e:'editor',t:'type'}
i = -2
na = false # next argument: false/opt/flag

for arg in args
  if m = arg.match /^--(.+?)(=(.+))?$/
    na = m[1]
    o[m[1]] = m[3] || true
  else if m = arg.match /^-(.+)/
    na = flags[m[1]]
    o[na] = true
    if !na
      console.log 'Unknown flag: '+m[1]
      process.exit 1
  else if ++i > 0 # ignore first two args which are node and app
    if na == 'message'
      o.message = [arg]
    else if na != false
      o[na] = arg
    else
      if o.message
        o.message.push arg
      else
        o._.push arg
    na = false
  else
    o['$0'].push arg

if o.message
  o.message = o.message.join ' '

console.log o

编辑:

实际上这种方法仍存在问题。我最后做了别的事情,但仍在寻找更好的解决方案。我想我最终会编写一个小的peg解析器来解析我想要的命令行选项。