commander.js 入門指南:構建強大的命令行界面 (全網最全教程)

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 方法接受三個參數:

  1. 參數的短名稱(如 -a)和長名稱(如 --numberA
  2. 參數的描述
  3. 可選的參數處理函數。在這個例子中,我們使用 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() 會返回一個包含所有命令行參數的對象。我們從該對象中提取 numberAnumberB,然后計算它們的和,并將結果輸出到控制臺。

最后,我們需要調用 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 官方文檔 中找到更多信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22073.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用TCC方案輕松實現分布式事務一致性

本文作者:小米,一個熱愛技術分享的29歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術干貨! 哈嘍,大家好!我是小米,一個熱愛技術的活力小青年,今天要和大家分享的是一種在分布式系統中實現事務的一種經典方案——TCC(Try Confirm Canc…

【Ubuntu】超詳細安裝Ubuntu系統

鑒于有些小伙伴在安裝Ubuntu系統的時候遇到很多問題&#xff0c;因此打算編寫一篇記錄一下安裝Ubuntu系統的整個過程~互相學習&#xff01; 一、制作U盤啟動 準備一個大于8G以上的U盤&#xff0c;這里我使用的是16G的U盤下載UltraISO工具 網站地址&#xff1a;UltraISO準備Ub…

C++ Primer 第五版 第15章 面向對象程序設計

面向對象程序設計基于三個基本概念&#xff1a;數據抽象、繼承和動態綁定。 繼承和動態綁定對編寫程序有兩方面的影響&#xff1a;一是我們可以更容易地定義與其他類相似但不完全相同的新類&#xff1b;二是在使用這些彼此相似的類編寫程序時&#xff0c;我們可以在一定程度上…

HTML靜態網頁成品作業(HTML+CSS)—— 金寶貝兒童教育機構介紹網頁(2個頁面)

&#x1f389;不定期分享源碼&#xff0c;關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 &#x1f3f7;?本套采用HTMLCSS&#xff0c;未使用Javacsript代碼&#xff0c;共有2個頁面。 二、作品演示 三、代…

Stable diffusion prompts 使用語法、參數講解、插件安裝教程

Stable diffusion prompts 使用語法、參數講解、插件安裝教程 本文基于 Stable diffusion WebUI 進行講解&#xff08;安裝在 AutoDL 上&#xff0c;安裝在本地電腦上的也同樣適用本教程&#xff09;。 初始界面&#xff1a; 文件目錄結構&#xff1a; 上圖紅框中的 4 個文件…

requests模塊編寫漏洞檢測工具

#嘗試使用python登錄pikachu爆破模塊 #發送post數據包&#xff0c;包含用戶名密碼&#xff0c;對接受到的響應進行判斷&#xff0c;如何為登錄成功 #爆破密碼 with open(passwor.txt,r) as f: passwordf.readlines() for i in password: data {username: admin, password: i, …

數據結構——算法和算法效率的度量

目錄 一、引言 二、算法 1 算法的基本概念 2 算法的復雜度 2.1 時間復雜度 2.1.1 概念 2.1.2 大O的漸進表示 3 算法的空間復雜度 3.1 概念 3.2 實例 4 實例分析 5 結論 一、引言 大家在寫代碼的時候有沒有發現寫同樣功能的代碼有多種不同的寫法&#xff0c;而不同的代…

51種企業應用架構模式詳解

01 什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有一些其他的說法&#xff0c;如“信息系統”或更早期的“數據處理”。&#xff09;那么&#xff0c;這里的“企業應用”具體指的是什…

[原型資源分享]經典產品餓了么UI模版部件庫

?部件庫預覽鏈接&#xff1a;https://f13gm0.axshare.com 支持版本: Axrure RP 8 文件大小: 3MB 文檔內容介紹 基本部件&#xff1a;表單樣式&#xff1a;12款、數據樣式&#xff1a;10款、服務樣式&#xff1a;6款、導航&#xff1a;5款、業務組件&#xff1a;7款、 模板…

python把簡體中文轉換為繁體中文

Python 可以使用第三方庫來將簡體中文&#xff08;簡體中文&#xff09;轉換為繁體中文&#xff08;繁體中文&#xff09;。一個常用的庫是 opencc-python-reimplemented&#xff0c;它是 Open Chinese Convert (OpenCC) 的 Python 實現&#xff0c;OpenCC 是一個開源的中文簡繁…

MySQL之查詢性能優化(三)

查詢性能優化 重構查詢的方式 在優化有問題的查詢時&#xff0c;目標應該是找到一個更優的方法獲得實際需要的記過——而不是一定總是需要從MySQL獲取一模一樣的結果集。有時候&#xff0c;可以將查詢轉換一種寫法讓其返回一樣的結果&#xff0c;但是性能更好。但也可以通過修…

Python魔法之旅-魔法方法(14)

目錄 一、概述 1、定義 2、作用 二、應用場景 1、構造和析構 2、操作符重載 3、字符串和表示 4、容器管理 5、可調用對象 6、上下文管理 7、屬性訪問和描述符 8、迭代器和生成器 9、數值類型 10、復制和序列化 11、自定義元類行為 12、自定義類行為 13、類型檢…

在Debian系統上賦予普通用戶ping 權限

在Debian系統上&#xff0c;普通用戶默認情況下沒有權限使用 ping 命令&#xff0c;因為它需要發送 ICMP 包&#xff0c;這通常需要 root 權限。為了允許普通用戶使用 ping&#xff0c;可以設置 ping 命令的 setuid 位。以下是具體的步驟&#xff1a; 查找 ping 命令的位置&am…

2024年度自貢市社會民生重大科技計劃項目申報要求、時間流程

一、申報要求 申報項目需符合以下申報要求和申報指南要求&#xff0c;申報資料需在“自貢市科技綜合業務服務平臺”中的“自貢市重點科技計劃項目管理系統”上傳。 &#xff08;一&#xff09;項目申報單位要求。 1.項目申報單位包括項目牽頭單位和項目合作單位。 2.多家單…

【Python】pyinstaller打包時添加詳細信息

在要被打包的py文件同級目錄新建version.txt&#xff0c;寫入以下內容 # UTF-8 # # For more details about fixed file info ffi see: # http://msdn.microsoft.com/en-us/library/aa381058.aspx # VSVersionInfo(ffiFixedFileInfo(filevers(1, 4, 0, 5),prodvers(1, 4, 0, 5…

SpringBoot使用RabbitMQ實現延遲隊列

SpringBoot使用RabbitMQ實現延遲隊列 需求和目標名詞解釋實現方式引入依賴添加配置文件配置類死信隊列消費者即時隊列消費者延遲消息發送結果注意 需求和目標 商城系統&#xff0c;用戶下單后若15分鐘內仍未完成支付&#xff0c;則自動取消訂單&#xff0c;若已支付&#xff0c…

重組蛋白的定量定性方法,你了解嗎?

重組蛋白的定量和定性分析是蛋白質工程和生物技術中至關重要的步驟&#xff0c;用于確保蛋白質的表達、純度和功能性符合預期。以下是小編整理的一些常用的方法以及實驗介紹&#xff0c;希望這些方法幫助研究人員詳細了解重組蛋白的特性。 主要的定性方法 1 WB&#xff08;Wes…

AIGC 011-SAM第一個圖像分割大模型-分割一切!

AIGC 011-SAM第一個圖像分割大模型-分割一切&#xff01; 文章目錄 0 論文工作1論文方法2 效果 0 論文工作 這篇論文介紹了 Segment Anything (SA) 項目&#xff0c;這是一個全新的圖像分割任務、模型和數據集。SA 項目是一個具有里程碑意義的工作&#xff0c;它為圖像分割領域…

基于springboot的多媒體素材庫源碼數據庫

基于springboot的多媒體素材庫源碼數據庫 近年來&#xff0c;信息化管理行業的不斷興起&#xff0c;使得人們的日常生活越來越離不開計算機和互聯網技術。首先&#xff0c;根據收集到的用戶需求分析&#xff0c;對設計系統有一個初步的認識與了解&#xff0c;確定多媒體素材庫…

迎七一黨史知識競賽答題怎么做

迎七一黨史知識競賽答題&#xff0c;不僅是對于黨史知識的檢驗&#xff0c;更是對于參賽者學習態度和綜合能力的考量。在參與這類競賽時&#xff0c;我們需要做好充分的準備&#xff0c;掌握一定的答題技巧&#xff0c;才能取得好的成績。 首先&#xff0c;我們要深入了解競賽…