天天看點

commanderJs編寫指令行工具(cli)

  最近需要做一個内部的node cli來獨立建構流程,對整個指令行工具實作流程有了大緻了解,下面來解釋一下如何實作一個cli,和如何使用 commander 庫。

  在開始實作之前,我知道有 commander 這個node庫,有很多cli使用了它,對它的大緻了解就是它可以幫助開發者簡化實作指令流程。  于是最初以為不利用庫要去實作指令行會很麻煩,commander 幫我們解決了各種相容問題等等。  後來發現并不是的,沒有commander 我們也可以不用化多大力氣實作指令行,commander 僅僅是一個本身也不太複雜的封裝(源碼也隻有1200行)。  我們的第一步還是應該先搞清楚,通過npm如何實作指令行。

  package.json 中有一個 bin 字段,指定各個内部指令對應的可執行檔案的位置。   在包安裝時,如果是全局安裝,npm 将會把 package.json 裡定義的 bin 檔案軟連接配接到全局 node_modules/bin,如果是非全局安裝,會軟連結到項目檔案夾./node_modules/.bin/。  根據下面代碼的配置,當我們全局安裝此包後,在任意位置運作 cli-test,都會執行全局 node_modules 中的 cli-test 檔案。

如果我們把cli安裝在項目A node_modules中,通過設定項目中 package.json 的 scripts,運作 npm run cli,npm 就會在項目的 node_modules/.bin 尋找并運作 cli-test 檔案。 

  下面是 cli-test 檔案,第一行必寫,是告訴Unix和Linux系統這個檔案中的代碼用node可執行程式去運作它。  後面就做我們要做的事情就行了 。

好了,到這裡我們的cli就完成了。  其實有很多三方cli也并沒有用類似 commander 的 node 庫,如果我們的 cli 足夠簡單,以上這樣就可以了。  下面接着講 commander。

現在我們先寫一個簡單的檔案來了解(也推薦先自行預覽一下 commander 官方文檔),下面是 bin 檔案夾的 cli-test,代碼如下:

解釋一下上面的代碼,從檢視源碼裡發現 require('commander')  會 new一個commander 内部的單例對象并傳回,program 已經是一個執行個體,

commanderJs編寫指令行工具(cli)

。  .usage  僅僅描述了參數規則,會在 --help 中列印出來。.option 定義了一個參數名和描述,  parse 會解析指令之中的參數,根據上面定義好的規則執行相關指令。  比如上面的代碼定義了 option 類型的參數 --type,執行 .parse 的時候,parse 根據 process.argv 之中的參數,擷取到 --type,并把參數命和參數值存儲在内部 commander 執行個體的屬性之中,是以後面的代碼就能從 program 之中取到 type,如果 type 不存在或者不是我們約定的值,最後我們列印參數錯誤,并執行help方法列印了 --help。  如下截圖,我們 node 執行 cli-test,因為沒有約定參數,是以執行了 else 的程式。(因為這裡是本地的demo程式,是以直接使用node指令)

commanderJs編寫指令行工具(cli)

接着,我們執行正确的指令參數,如下

commanderJs編寫指令行工具(cli)

這樣一個簡單的demo就實作了,看起來也挺簡單的,commander 封裝了一些也不算很複雜的功能。 

建立了兩個檔案,要以 bin 指令的執行檔案命後面加上 -name,作為子指令檔案

commanderJs編寫指令行工具(cli)

cli-test:

cli-test-h5:

cli-test-rn:

先直接運作3個指令運作程式,看下結果,而後分别解釋一下:

commanderJs編寫指令行工具(cli)

node ./bin/cli-test:

定義了.command子指令卻沒有相應執行參數,commander對象會直接列印-help,并process.exit退出程序。  

node ./bin/cli-test h5 --type dev:

cli-test 通過 command 方法約定子指令名稱和描述,如 h5,當執行 node cli-test h5 --type dev的時候,cli-test 執行到 .command('h5', 'to h5')  ,會在目前 commander 執行個體内部,new 一個 name 為 h5 的子 commander,存儲在目前父執行個體的 commands 數組中,當 .parse(process.argv) 執行,擷取到參數中 h5 後,在 commands 裡查找是否有 name 為 h5 的 commander 子執行個體,如果查找到,啟動一個子程序按照命名規則執行 cli-test-h5 檔案并帶入後面的 option 參數。 這樣 commander 就幫助我們實作了多檔案指令劃分,我們可以把不同類型的執行代碼放在不同的檔案中。

node ./bin/cli-test rn --type build:

同上

bin 檔案夾下的這3個 node 檔案他們都是 commander 執行個體,commander 庫隻是一個簡單的封裝,幫助定義 多檔案指令、執行參數 、簡易文檔,參數驗證等。  以上就是 commander 的大緻使用和我對其的了解。   源碼不多,建議可以深入學習一下。

  到最後大家結合實作以上所說的 cli 和 commander,一個 commander 實作的指令行工具就能完成了,是不是很簡單!?  

  如果執行指令發現報錯為 error: xx(1) not executable. try chmod or run with root,要注意下建立的檔案類型。

commanderJs編寫指令行工具(cli)

有沒有人打賞?沒有的話,那我晚點再來問問。

commanderJs編寫指令行工具(cli)

關注大詩人公衆号,第一時間擷取最新文章。

commanderJs編寫指令行工具(cli)

如果你有購買鋼琴的打算,可以從這裡了解到在售資訊,價格實惠品質保障。

---轉發請标明,并添加原文連結---