node.jsにオプティミストを使用しており、次のように入力を解析したいと思います。
$ command some args -m this is the message
これに
{argv:{_:['some','args'],m:'this is the message'}}
これは楽観主義者で可能ですか?これは一般的に可能ですか?
node.jsにオプティミストを使用しており、次のように入力を解析したいと思います。
$ command some args -m this is the message
これに
{argv:{_:['some','args'],m:'this is the message'}}
これは楽観主義者で可能ですか?これは一般的に可能ですか?
一般に、引数パーサーではなく、スペースを含む引数をグループ化するのはシェルの責任です。これは通常、ユーザーが複数単語の引数を引用することによって行われます(Unixタイプのシェルでは一重引用符または二重引用符で、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
ここにこんにちは」となることになりますが、これはおそらくあなたが望んでいることではありません。
私はこれを行うことになりました。これは私のユースケースで機能します。
#!/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
実際、この方法にはまだ問題があります。私は別のことをすることになりましたが、それでもより良い解決策を探しています。コマンドラインオプションを希望どおりに解析するために、小さなペグパーサーを作成することになります。