2015-05-14 212 views
1

我使用commander.js來解析命令行參數,我試圖收集可以出現多次的可選參數,它總是返回我設置的選項加上默認一個。Commander.js收集多個選項總是包括默認

function collect (val, memo) { 
    memo.push(val); 
    return memo; 
} 

program 
    .command('run <param>') 
    .action(function run(param, options) { 
     console.log(param); 
     console.log(options.parent.config); 
    }); 

program 
    .option('-c, --config <path>', 'Config', collect, ["/path/to/default"]) 
    .parse(process.argv); 

當我打電話這樣index.js run some -c "/some/path" -c "/other/path"腳本它打印[ '/path/to/default', '/some/path', '/other/path' ] ,它應該只打印['/some/path', '/other/path' ]

,當我把它叫做沒有它工作正常使用-c PARAM,印刷用默認值的陣列。

我該如何解決這個問題?

回答

1

commander「重複值」選項不支持默認值,至少在使您不必編寫自己的邏輯來處理,其中用戶通過一個或多個值的情況的一種方式。 你寫代碼的方式,你得檢查program.config屬性的大小:

  • 如果用戶通過一個或多個-c選項值,大小爲> 1;
  • 否則,它是=== 1

IMO,這個方案要求「A名單」選項,它支持的默認值,併爲您節省一些額外的工作。像:

program 
    .option('-l, --list <items>', 'A list', list, [ "/path/to/default" ]) 
    .parse(process.argv); 

要訪問傳遞的值,只需撥打program.list,並在命令行中,其值叫它:

$ index.js run some -l "/some/path","/other/path" 
// where console.log(program.list) prints [ "/some/path", "/other/path" ] 

或者說,沒有價值觀:

$ index.js run some 
// where console.log(program.list) prints [ "/path/to/default" ]