在Node.js
的世界里,創建用戶友好的命令行界面(CLI)對于許多應用程序和工具來說至關重要。Commander.js
是一個廣受歡迎的 Node.js 包,它為開發者提供了一套簡潔而強大的 API,用于快速創建功能完備、用戶友好的命令行界面(CLI)應用程序。
一、安裝 Commander.js
首先確保您已安裝 Node.js 環境。然后,使用 npm(Node Package Manager)輕松安裝 Commander.js:
npm install commander
這將在您的項目中添加 commander
依賴項,您可以在項目的 JavaScript 文件中通過 require()
來引入并使用它。
const { program } = require('commander');// 或者通過創建實例的方式const { Command } = require('commander');
const program = new Command();
二、基礎用法:定義命令與選項
Commander.js 提供了許多方法來幫助你構建功能豐富的命令行應用。以下是一些常用的方法:
1, 在 Commander.js 中,program
代表整個命令行程序的根節點,通過它您可以定義子命令、選項、參數以及執行動作。
program.command(name[, description])
:
定義一個新的子命令。name
是子命令的名稱,description
是可選的描述。
const subCommand = program.command('sub', 'Sub command description');
program.alias(name)
:
為命令或子命令設置一個別名。
program.command('list').alias('ls');
program.description(desc)
:
為命令或子命令設置描述。
program.command('clone').description('Clone a repository');
program.version(version[, flags[, description]])
:
設置程序的版本信息,并關聯一個可選的命令行選項,以便用戶查詢版本。
// version: (`string`) 程序的版本號。// optionFlags (`string`, *可選*): 指定顯示版本信息的命令行選項,如 `-V, --version`。如果不提供,將默認為 `--version`。// description (`string`, *可選*): 版本選項在幫助信息中的描述。
program.version('1.2.3', '-v, --version', 'Output the current version');
program.helpOption(flags[, description])
:
自定義幫助選項。默認情況下,Commander.js 會添加一個 -h, --help
選項。你可以使用此方法更改幫助選項的名稱和描述。
program.helpOption('-i, --info', 'Display help information');
program.option(flags, description, [defaultValue], [fn])
是 Commander.js 中的一個方法,用于定義全局選項,可以定義多個全局選項。。它允許你提供一個短名稱、一個長名稱、一個描述以及一個可選的處理函數來處理輸入的參數值。
// - `flags`:這是一個字符串,包含參數的短名稱和長名稱。短名稱和長名稱,中間可以逗號、豎線或空格隔開。例如:`-a, --numberA`。
// - `description`:這是一個字符串,描述了參數的用途。這個描述將在命令行應用的幫助信息中顯示。
// - `defaultValue`(可選):這是參數的默認值。如果用戶沒有提供參數值,將使用此默認值。
// - `fn`(可選):這是一個函數,用于處理輸入的參數值。例如,你可以使用 `parseInt` 或 `parseFloat` 函數將輸入的字符串轉換為數字。如果未提供此函數,參數值將作為字符串處理。program.option("-d, --debug", "是否開啟調試模式", false)// -e/--env后跟的字符,將存到envName屬性中.option("-e, --envName <envName>", "獲取環境變量名稱", 'production');
獲取選項鍵值對
使用opts()獲取解析命令行參數后的選項鍵值對,屬性名為選項的長標識
const opts = program.opts();
console.log(opts) // => {debug: false, envName: 'production'}
program.parse(process.argv)
// 這行代碼是用來解析命令行參數的,它將會讀取 process.argv 數組中的參數,并根據定義的命令和選項來執行相應的操作。// 其中,process.argv 是一個包含命令行參數的數組,
// 第一個元素是 Node.js 的可執行文件路徑,
// 第二個元素是當前執行的 JavaScript 文件路徑,
// 之后的元素是傳遞給腳本的參數。
process.argv ['/Users/nolan/.nvm/versions/node/v20.12.1/bin/node','/Users/nolan/Desktop/zustand-cli/src/index.js','zustand','new'
]
// program.parse(process.argv) 將會解析這些參數并執行對應的命令。// argv(`string[]`, 默認: `process.argv.slice(2)`): 要解析的命令行參數數組。通常不需要傳遞,直接使用默認值即可。program.parse(process.argv);
三、實戰演練:創建一個簡單的文件查找器
創建一個簡單的命令行應用
我們將創建一個簡單的命令行應用,用于計算兩個數字的和。首先,創建一個名為 addition-cli.js
的文件,并引入 Commander.js:
const { program } = require('commander');
接下來,我們需要定義我們的命令行參數。在這個例子中,我們需要兩個數字參數。我們將使用 option
方法來定義這些參數:
program.option('-a, --numberA <value>', 'First number', parseFloat).option('-b, --numberB <value>', 'Second number', parseFloat);
option
方法接受三個參數:
- 參數的短名稱(如
-a
)和長名稱(如--numberA
) - 參數的描述
- 可選的參數處理函數。在這個例子中,我們使用
parseFloat
將輸入的字符串轉換為浮點數。
現在,我們需要處理這些參數,并執行相應的操作。我們將使用 action
方法來實現這一點:
program.action(() => {const { numberA, numberB } = program.opts();if (numberA === undefined || numberB === undefined) {console.error('Both numbers must be provided');process.exit(1);}const result = numberA + numberB;console.log(`The sum of ${numberA} and ${numberB} is ${result}`);
});
program.opts()
會返回一個包含所有命令行參數的對象。我們從該對象中提取 numberA
和 numberB
,然后計算它們的和,并將結果輸出到控制臺。
最后,我們需要調用 program.parse()
方法來解析命令行參數:
program.parse(process.argv);
現在,我們的 addition-cli.js
文件應該如下所示:
#!/usr/bin/env nodeconst { program } = require('commander');program.option('-a, --numberA <value>', 'First number', parseFloat).option('-b, --numberB <value>', 'Second number', parseFloat);program.action(() => {const { numberA, numberB } = program.opts();if (numberA === undefined || numberB === undefined) {console.error('Both numbers must be provided');process.exit(1);}const result = numberA + numberB;console.log(`The sum of ${numberA} and ${numberB} is ${result}`);
});program.parse(process.argv);
測試我們的命令行應用
現在,我們可以通過運行以下命令來測試我們的命令行應用:
node addition-cli.js -a 3.2 -b 4.8
輸出應該如下所示:
The sum of 3.2 and 4.8 is 8
總結
在本文中,我們學習了如何使用 Commander.js 創建一個簡單的命令行應用。我們通過一個實際的例子介紹了如何定義和處理命令行參數。當然,Commander.js 還有許多其他功能,如子命令、自定義幫助信息等,你可以在 Commander.js 官方文檔 中找到更多信息。