Node CLI 之 Commander.js (1)

官網地址: https://github.com/tj/commander.js/blob/f1ae2db8e2da01d6efcbfd59cbf82202f864b0c1/Readme_zh-CN.md

Commander.js是node.js命令行界面的完整解決方案

開始

  • 新建一個node工程
  • 執行 npm install commander
  • package.json中新增代碼
  • 添加 #! /usr/bin/env node,用于識別是node命令文件
"bin": {"cli": "./index.js"
}

聲明 program 變量

/ CommonJS (.cjs)
const { program } = require('commander');

如果程序較為復雜,用戶需要以多種方式來使用 Commander,如單元測試等。創建本地 Command 對象是一種更好的方式:

const { Command } = require('commander');
const program = new Command();

選項 option

使用 .option 實現,舉個例子,然后再解釋難點

program.option('-d, --debug', 'output extra debugging').option('-s, --small', 'small pizza size').option('-p, --pizza-type <type>', 'flavour of pizza');.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');.option('-d, --drink [item]', 'output extra debugging', function deb (v) {console.log('1---', arguments);return '123'})
  • 第一個參數是選項名稱,第二個參數選項描述, 第三個參數是默認值, 第四個為過濾函數,會改改變用戶輸入的值
  • 每個選項可以定義一個短選項名稱(-后面接單個字符)
  • 一個長選項名稱(–后面接一個或多個單詞),駝峰命名法(camel-case)
  • 短名稱和長名稱之間可以使用逗號,空格,|分割
  • 有兩種最常用的選項
    • 一類是 boolean 型選項,選項無需配置參數,
    • 另一類選項則可以設置參數(使用尖括號聲明在該選項后,如–expect )。如果在命令行中不指定具體的選項及參數,則會被定義為undefine
調用方式
serve -p 80
serve -p80
serve --port 80
serve --port=80

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

完整例子
program.option('-d, --debug', 'output extra debugging').option('-s, --small', 'small pizza size').option('-p, --pizza-type <type>', 'flavour of pizza');.option('-d, --drink [item]', 'output extra debugging', function deb (v) {console.log('1---', arguments);return '123'})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}`);
必填選項

通過 .requiredOption 方法可以設置選項為必填。必填選項要么設有默認值,要么必須在命令行中輸入,對應的屬性字段在解析時必定會有賦值。該方法其余參數與 .option一致

program.requiredOption('-c, --cheese <type>', 'pizza must have cheese');program.parse();終端中部署入參數,會報錯
error: required option '-c, --cheese <type>' not specified
變長參數選項

通過使用 來設置參數為可變長參數

program.option('-n, --number <numbers...>', 'specify numbers').option('-l, --letter [letters...]', 'specify letters');program.parse();console.log('Options: ', program.opts());
console.log('Remaining arguments: ', program.args);
$ collect -n 1 2 3 --letter a b c
Options:  { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] }
Remaining arguments:  []
$ collect --letter=A -n80 operand
Options:  { number: [ '80' ], letter: [ 'A' ] }
Remaining arguments:  [ 'operand' ]
$ collect --letter -n 1 -n 2 3 -- operand
Options:  { number: [ '1', '2', '3' ], letter: true }
Remaining arguments:  [ 'operand' ]
其他選項配置

大多數情況下,選項均可通過.option()方法添加。但對某些不常見的用例,也可以直接構造Option對象,對選項進行更詳盡的配置

program.addOption(new Option('-s, --secret').hideHelp()).addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute')).addOption(new Option('-d, --drink <size>', 'drink size').choices(['small', 'medium', 'large'])).addOption(new Option('-p, --port <number>', 'port number').env('PORT')).addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)).addOption(new Option('--disable-server', 'disables the server').conflicts('port')).addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' }));

版本選項

.version 方法可以設置版本,其默認選項為-V和–version,設置了版本后,命令行會輸出當前的版本號

program.version('0.0.1');

命令

通過 .command.addCommand 可以配置命令, 有兩種實現方式

  • 為命令綁定處理函數
  • 將命令單獨寫成一個可執行文件

先看例子

// 通過綁定處理函數實現命令(這里的指令描述為放在`.command`中)
// 返回新生成的命令(即該子命令)以供繼續配置
program.command('clone <source> [destination]').description('clone a repository into a newly created directory').option('-t, --typeName <typeName>', '基于哪個項目').action((source, destination) => {console.log('clone command called');});// 通過獨立的的可執行文件實現命令 (注意這里指令描述是作為`.command`的第二個參數)
// 返回最頂層的命令以供繼續添加子命令
program.command('start <service>', 'start named service').command('stop [service]', 'stop named service, or all if no name supplied');// 分別裝配命令
// 返回最頂層的命令以供繼續添加子命令
program.addCommand(build.makeBuildCommand());
  • .command 的第一個參數為命令名稱, 命令參數可以跟在名稱后面,也可以用.argument 單獨指定, 參數可為必選的(尖括號表示)、可選的(方括號表示)或變長參數(點號表示,如果使用,只能是最后一個參數)
  • option 為命令中的選項 比如 vue create my-project -t vue-template
  • .description 為命令描述
  • .action 為命令觸發之后,執行的函數

舉個例子:

program.command('rmdir <soure>').description('remove some directory').option('-f, --force', '強制刪除').action((source, destination) => {console.log('remove some directory');});
// 調用方式
// Try the following:
//    rmdir ./project
//    rmdir ./project -f
//    rmdir ./project --forceprogram.command('add').argument('<first>', 'integer argument', myParseInt).argument('[second]', 'integer argument', myParseInt, 1000).action((first, second) => {console.log(`${first} + ${second} = ${first + second}`);});
// 調用方式
// Try the following:
//    add 1
//    add 1 2program.argument("<name>").option("-t, --title <honorific>", "title to use before name").option("-d, --debug", "display some debugging").action((name, options, command) => {if (options.debug) {console.error("Called %s with options %o", command.name(), options);}const title = options.title ? `${options.title} ` : "";console.log(`Thank-you ${title}${name}`);});// 調用方式
// Try the following:
//    node thank.js John
//    node thank.js Doe --title Mr
//    node thank.js --debug Doe --title Mr

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

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

相關文章

Linux 詳細介紹strace命令

system call(系統調用)是程序向內核請求服務的一種編程方式&#xff0c;strace是一個功能強大的工具&#xff0c;可以跟蹤用戶進程和 Linux 內核之間的交互。 要了解操作系統如何工作&#xff0c;首先需要了解系統調用如何工作。操作系統的主要功能之一是為用戶程序提供了一個…

HJ94 記票統計

題目&#xff1a; HJ94 記票統計 題解&#xff1a; 利用哈希表&#xff0c;投票是按姓名從哈希表中取出對應的票數&#xff0c;如果不在哈希表內證明為無效。 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n Inte…

PyQt6 QTimeEdit時間控件

?鋒哥原創的PyQt6視頻教程&#xff1a; 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計39條視頻&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面開發 視頻教程(無廢話…

C++新經典模板與泛型編程:將trait類模板用作模板參數

將trait類模板用作模板參數 template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int;static sumT initValue() {return 0;} };template<> struct SumFixedTraits<int> {using sumT __int64;sta…

Proteus仿真--基于DAC0808設計的直流電機調速器

本文介紹基于DAC0808設計的直流電機調速器設計&#xff08;完整仿真源文件及代碼見文末鏈接&#xff09; 設置按鍵A-H按鍵&#xff0c;每個按鍵分別對應不同的速度&#xff0c;按下后電機按照設定速度轉動 仿真圖如下 仿真運行視頻 Proteus仿真--基于DAC0808設計的直流電機調…

互聯網數據傳輸原理 |OSI七層網絡參考模型

網絡模型 OSI 網絡參考模型&#xff0c;僅作為參考&#xff0c;也就是說OSI網絡實際中并不使用。我們只是把OSI網絡模型作為參考&#xff0c;在網絡出現問題的時候&#xff0c;可以從一個宏觀的整體去分析和解決問題。而且搭建網絡的時候也并不一定需要劃分為7層 但是當今互聯…

【uniapp】小程序中input輸入框的placeholder-class不生效解決辦法

問題描述 uniapp微信小程序&#xff0c;使用input組件時&#xff0c;想要改變提示詞 placeholder 的樣式&#xff0c;但是使用placeholder-class 改變不了 如下&#xff1a; <input type"text" placeholder"搜索" placeholder-class"placeholde…

2024最新金三銀四軟件測試面試題

一直以來大大小小參與過不少面試&#xff0c;遇到過不少坑&#xff0c;但是沒來的及好好總結匯總下。現在把之前遇到的問題匯總下&#xff0c;希望以后自己能加深印象。 1、appium 怎么定位toast彈框 appium1.6以后回答需要升級u2進行定位。 2、什么是事務&#xff0c;知道事…

PADS9.5封裝庫轉換為AD庫

1、打開PADS Layout&#xff0c;File – Library&#xff0c;選中usr&#xff0c;如下圖&#xff1a; 2、封裝– 導入&#xff0c;選中你的 .d后綴文件(也就是PADS的封裝文件)&#xff0c;打開。 3、元件 – 新建 – PCB封裝 - 分配 - 確定。 4、&#xff0c;選擇“斜線”…

Laya2.13.3接入第三方庫Socket.io

服務端&#xff1a; 1.新建一個文件夾&#xff0c;使用npm.init -y創建node工程 2.在控制臺使用以下代碼下載Socket.io npm install socket.io 3.創建一個app.js的文件&#xff0c;將以下代碼填入 import { Server } from "socket.io"; import { createServer }…

Linux學習筆記3 xshell(lnmp)

xshell能連接虛擬機的前提是真機能夠ping通虛擬機網址 裝OpenSSL依賴文件 [rootlocalhost nginx-1.12.2]# yum -y install openssl pcre-devel 依賴檢測[rootlocalhost nginx-1.12.2]# ./configure [rootlocalhost nginx-1.12.2]# yum -y install zlib [rootlocalhost n…

【騰訊云 HAI域探秘】StableDiffusionWebUI 讓我找到了宮崎駿動漫里的夏天

目錄 前言一、HAI二、應用場景三、構建 Stable Diffusion 模型1、新建HAI應用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介紹&#xff08;2&#xff09;頁面轉中文&#xff08;3&#xff09;AI繪圖① 正向提示詞語② 反向提示詞③ “” 、“ AND”、“|” 用法④ 權…

自定義函數參數傳遞問題

最近&#xff0c;被一個函數調用參數傳遞的問題困惑了一陣。自己寫的解釋程序&#xff0c;一直用的好好的。在暗自得意的過程中&#xff0c;突然出現了bug&#xff0c;被潑了一頭冷水。當然&#xff0c;bug是在無意中被發現的&#xff0c;確定以后則可以編制專用的代碼來揭示它…

重積分的應用@物體對外部質點的引力問題

文章目錄 引力(*)分析兩質點間的引力公式三重積分計算引力薄片情形計算例 引力(*) 這里討論的是:空間一物體對于物體外一點 P 0 ( x 0 , y 0 , z 0 ) P_{0}(x_0,y_0,z_0) P0?(x0?,y0?,z0?)處單位質量的質點的引力 分析 仍然使用元素法, 設占有空間有界閉區域 Ω \Omega …

網絡協議與 IP 編址

網絡協議與 IP 編址 之前大概了解過了網絡的一些基礎概念&#xff0c;見文章&#xff1a; 網絡基礎概念。 之前簡單了解OSI模型分層&#xff1a; TCP/IP模型OSI模型TCP/IP對等模型應用層應用層表示層應用層會話層主機到主機層傳輸層傳輸層因特網層網絡層網絡層網絡接入層數據鏈…

jsonwebtoken生成token和解析

先上npm地址 jsonwebtoken&#xff1a;jsonwebtoken - npm express-jwt&#xff1a;express-jwt - npmps const express require(express); const jwt require(jsonwebtoken); const { expressjwt: expressJWT} require(express-jwt)const app express();// 設置密鑰 co…

愛智EdgerOS之深入解析數據庫模塊的Redis Client

一、Redis 簡介 無論是什么類型的應用&#xff0c;都少不了和數據打交道。尤其是一些復雜的應用場景&#xff0c;都少不了一個高效可靠的數據庫。例如日常開發中最常見的 MySQL 等關系型數據庫&#xff0c;讓數據的存儲、檢索輕松簡單起來&#xff0c;甚至可以輕松地處理百萬量…

51單片機c語言燒錄軟件,51單片機燒寫程序的方法

STC89C51是應用廣泛的51單片機&#xff0c;很多人都是通過該單片機入門學習的&#xff0c;單片機的學習需要勤動手。單片機需要燒寫程序&#xff0c;要用到相關的軟件和硬件。下面介紹一下51單片機燒寫程序的方法。 1 所用到的硬件工具 51單片機燒寫程序需要用到單片機的UART…

C語言數組(下)

我希望各位可以在思考之后去看本期練習&#xff0c;并且在觀看之后獨立編寫一遍&#xff0c;以加深理解&#xff0c;鞏固知識點。 練習一&#xff1a;編寫代碼&#xff0c;演?多個字符從兩端移動&#xff0c;向中間匯聚 我們依舊先上代碼 //編寫代碼&#xff0c;演?多個字…

數據庫Delete的多種用法

數據庫的Delete操作是用來刪除數據庫中的數據記錄的&#xff0c;它是數據庫操作中的一種重要操作&#xff0c;能夠幫助用戶刪除不需要的數據&#xff0c;以便保持數據庫的整潔和高效。在使用Delete操作時&#xff0c;需要注意確保操作的準確性和安全性&#xff0c;以免誤刪重要…