使用 Commander 寫(xiě)自己的 Nodejs 命令

commander 是一個(gè)輕巧的 nodejs 模塊,提供了用戶(hù)命令行輸入和參數(shù)解析強(qiáng)大功能。
安裝
npm install commander聲明 program 變量
為簡(jiǎn)化使用,Commander 提供了一個(gè)全局對(duì)象。本文檔的示例代碼均按此方法使用:
const { program } = require('commander');program.version('0.0.1');
如果程序較為復(fù)雜,用戶(hù)需要以多種方式來(lái)使用 Commander,如單元測(cè)試等。創(chuàng)建本地 Command 對(duì)象是一種更好的方式:
const { Command } = require('commander');const program = new Command();program.version('0.0.1');
選項(xiàng)
Commander 使用 .option() 方法來(lái)定義選項(xiàng),同時(shí)可以附加選項(xiàng)的簡(jiǎn)介。每個(gè)選項(xiàng)可以定義一個(gè)短選項(xiàng)名稱(chēng)(-后面接單個(gè)字符)和一個(gè)長(zhǎng)選項(xiàng)名稱(chēng)(--后面接一個(gè)或多個(gè)單詞),使用逗號(hào)、空格或|分隔。
選項(xiàng)可以通過(guò)在 Command 對(duì)象上調(diào)用 .opts() 方法來(lái)獲取。對(duì)于多個(gè)單詞的長(zhǎng)選項(xiàng),使用駝峰法獲取,例如 --template-engine 選項(xiàng)通過(guò) program.opts().templateEngine 獲取。
多個(gè)短選項(xiàng)可以合并簡(jiǎn)寫(xiě),其中最后一個(gè)選項(xiàng)可以附加參數(shù)。例如,-a -b -p 80 也可以寫(xiě)為 -ab -p80 ,甚至進(jìn)一步簡(jiǎn)化為 -abp80。
--可以標(biāo)記選項(xiàng)的結(jié)束,后續(xù)的參數(shù)均不會(huì)被命令解釋?zhuān)梢哉J褂谩?/p>
默認(rèn)情況下,選項(xiàng)在命令行中的順序不固定,一個(gè)選項(xiàng)可以在其他參數(shù)之前或之后指定。
常用選項(xiàng)類(lèi)型,boolean 型選項(xiàng)和帶參數(shù)選項(xiàng)。
有兩種最常用的選項(xiàng),一類(lèi)是 boolean 型選項(xiàng),選項(xiàng)無(wú)需配置參數(shù),另一類(lèi)選項(xiàng)則可以設(shè)置參數(shù)(使用尖括號(hào)聲明在該選項(xiàng)后,如 --expect <value>)。如果在命令行中不指定具體的選項(xiàng)及參數(shù),則會(huì)被定義為 undefined。
示例代碼:options-common.js
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}`);
測(cè)試命令
$ pizza-options -d{ debug: true, small: undefined, pizzaType: undefined }pizza details:$ pizza-options -perror: option '-p, --pizza-type <type>' argument missing$ pizza-options -ds -p vegetarian{ debug: true, small: true, pizzaType: 'vegetarian' }pizza details:- small pizza size- vegetarian$ pizza-options --pizza-type=cheesepizza details:- cheese
通過(guò) program.parse(arguments) 方法處理參數(shù),沒(méi)有被使用的選項(xiàng)會(huì)存放在 program.args 數(shù)組中。該方法的參數(shù)是可選的,默認(rèn)值為 process.argv。
選項(xiàng)的默認(rèn)值
選項(xiàng)可以設(shè)置一個(gè)默認(rèn)值。
示例代碼:options-defaults.js
program.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');program.parse();console.log(`cheese: ${program.opts().cheese}`);
測(cè)試命令
pizza-optionscheese: bluepizza-options --cheese stiltoncheese: stilton
