banner
SlhwSR

SlhwSR

热爱技术的一名全栈开发者
github
bilibili

開坑指揮官

  1. 全局安裝 commander (yarn|pnpm | npm)
  2. node 執行即可運行 commander 腳本
  3. commander 內建 program 支援鏈式調用,添加 option、description、parse 寫入。
const { program } = require('commander');

program
  .option('--first')
  .option('-s, --separator <char>');

program.parse();

const options = program.opts();
const limit = options.first ? 1 : undefined;
console.log(program.args[0].split(options.separator, limit));

program.opts 可接收到 options 參數。

選項#

Commander 使用.option () 方法來定義選項,同時可以附加選項的簡介。每個選項可以定義一個短選項名稱(- 後面接單個字符)和一個長選項名稱(-- 後面接一個或多個單詞),使用逗號、空格或 | 分隔。

解析後的選項可以通過 Command 對象上的.opts () 方法獲取,同時會被傳遞給命令處理函數。

對於多個單詞的長選項,選項名會轉為駝峰命名法(camel-case),例如 --template-engine 選項可通過 program.opts ().templateEngine 獲取。

選項及其選項參數可以用空格分隔,也可以組合成同一個參數。選項參數可以直接跟在短選項之後,也可以在長選項後面加上 =。

serve -p 80
serve -p80
serve --port 80
serve --port=80

-- 可以標記選項的結束,後續的參數均不會被命令解釋,可以正常使用。

默認情況下,選項在命令行中的順序不固定,一個選項可以在其他參數之前或之後指定。

當.opts () 不夠用時,還有其他相關方法:

.optsWithGlobals () 返回合併的本地和全局選項值
.getOptionValue () 和.setOptionValue () 操作單個選項的值
.getOptionValueSource () 和.setOptionValueWithSource () 包括選項值的來源。

常用選項類型,boolean 型選項和帶參數選項#

有兩種最常用的選項,一類是 boolean 型選項,選項無需配置參數,另一類選項則可以設置參數(使用尖括號聲明在該選項後,如 --expect )。如果在命令行中不指定具體的選項及參數,則會被定義為 undefined。

program
  .option('-d, --debug', 'output extra debugging')
  .option('-s, --small', 'small pizza size')
  .option('-p, --pizza-type <type>', 'flavour of pizza');

program.parse(process.argv);

const options = program.opts();
if (options.debug) console.log(options);
console.log('pizza details:');
if (options.small) console.log('- small pizza size');
if (options.pizzaType) console.log(`- ${options.pizzaType}`);

舉個例子吧

$ pizza-options -p
error: option '-p, --pizza-type <type>' argument missing
$ pizza-options -d -s -p vegetarian
{ debug: true, small: true, pizzaType: 'vegetarian' }
pizza details:
- small pizza size
- vegetarian
$ pizza-options --pizza-type=cheese
pizza details:
- cheese

多個布爾短選項可以在破折號之後組合在一起,並且可以跟一個取值的單一選項。 例如 -d -s -p cheese 可以寫成 -ds -p cheese 甚至 -dsp cheese

具有預期選項參數的選項是貪婪的,並且無論值如何,都會消耗參數。 所以 --id -xyz 讀取 -xyz 作為選項參數。

通過 program.parse (arguments) 方法處理參數,沒有被使用的選項會存放在 program.args 數組中。該方法的參數是可選的,默認值為 process.argv。

選項的默認值#

給 program 的 option 方法添加第三個參數,

program
  .option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');

program.parse();

console.log(`cheese: ${program.opts().cheese}`)
$ pizza-options
cheese: blue
$ pizza-options --cheese stilton
cheese: stilton

其他的選項類型,取反選項,以及可選參數的選項#

可以定義一個以 no - 開頭的 boolean 型長選項。在命令行中使用該選項時,會將對應選項的值置為 false。當只定義了帶 no - 的選項,未定義對應不帶 no - 的選項時,該選項的默認值會被置為 true。

例如: nest g res mq --no-spec
如果已經定義了 --foo,那麼再定義 --no-foo 並不會改變它本來的默認值。

再例如:

program
  .option('--no-sauce', 'Remove sauce')
  .option('--cheese <flavour>', 'cheese flavour', 'mozzarella')
  .option('--no-cheese', 'plain with no cheese')
  .parse();

const options = program.opts();
const sauceStr = options.sauce ? 'sauce' : 'no sauce';
const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`;
console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`);

這意味著,默認情況下,options.sauce 的值為 true。只有當用戶在命令行中明確地使用 --no-sauce 選項時,options.sauce 的值才會被設置為 false。

這就是為什麼 sauce 的默認值是 true 的原因。如果用戶不使用任何關於 sauce 的選項,或者只使用 --sauce 選項(雖然它在給定的選項定義中並未明確列出),那麼 options.sauce 的值都會是 true。只有當用戶使用 --no-sauce 選項時,其值才會變為 false。
來看打印結果吧

$ pizza-options
You ordered a pizza with sauce and mozzarella cheese
$ pizza-options --sauce
error: unknown option '--sauce'
$ pizza-options --cheese=blue
You ordered a pizza with sauce and blue cheese
$ pizza-options --no-sauce --no-cheese
You ordered a pizza with no sauce and no cheese
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。