Node.js編寫CLI的執行個體詳解,node.jscli執行個體
Why Node.js?
常用的用來編寫CLI的語言有 python, ruby, perl, Node.js等等。 為什麼選取Node.js作為CLI的語言編寫工具呢?有三個理由:
- 對Javascript語言更加熟悉
- npm 完善的生態系統
- npm OS無關的包管理機制
主要原因還是歸咎於npm 完善的生態,目前npm官方有47.5萬個三方包可供使用,你可以很方便的使用一些已經編寫的很不錯的輪子去幫你快速開發。另一方面,你不需要考慮跨平台的安裝問題,比如OSX上的homebrew、Debian的aptitude、CentOS 上的yum。如果使用shell或者其它語言來編寫CLI,需要針對各個主流OS來做相容並且發布到不同的平台。
看個demo
註: 此處的Logo使用的是figlet這個npm包來協助產生
npm關聯CLI的基本原理
如何讓Node.js編寫的包可執行?其實很簡單,只需要在package.json裡面增加一個bin欄位。模組發布到npm上後,開發人員安裝這個包的時候會檢查是否有bin欄位,如果有bin欄位則會使用軟連結的方式建立可以全域使用的命令。
如果模組採用全域安裝的方式,對於類unix系統,會在/usr/local/bin目錄建立軟連結,對於windows系統,在C:\Users\username\AppData\Roaming\npm目錄建立軟連結。
如果模組採用局部安裝的方式,則會在項目內的./node_modules/.bin目錄建立軟連結。
配置好的package.json如下:
… "description": "A command line tool aims to improve front-end engineer workflow.", "main": "lib/index.js", "bin" : { "feflow" : "./bin/feflow" }…
CLI基本命令設計
$ feflow --help A command line tool aims to improve front-end engineer workflow Usage: feflow [options] [command] Commands: init Choose a scaffold to initialize project. scan --receiver Scan a group and mail to receiver install <plugin> Install a plugin or a yeoman generator. Options: --version, -[vV] Print version and exit successful --help, Print this help and exit successf
Feflow的技術架構
Feflow總體分為3個模組,包括parser命令列參數解析、核心命令以及外掛程式機制。設計外掛程式主要是為了保持整體功能的穩定,避免頻繁升級;同時開放能力,支援開發人員接入,完善整體的生態。
掃描器的實現
在一個工程項目中,有各種各樣的規範,比如項目命名規範、描述規範、目錄結構規範、README.md規範,是否增加基本監控等等。編寫掃描器scanner,對某個Group裡面的所有商務專案進行掃描,將不符合規範的倉庫和不符合規範的地方列舉出來,並且撈出責任人。最後通過郵件及定時任務發送給相關同學,並且敦促修改。掃描器流程圖如下:
首先,需要一個任務隊列,隊列裡面存放不同的掃描任務。每個掃描任務依賴相關的檔案資訊或者Commit資訊,這個時候需要調用Git code提供的三方API進行檔案資訊拉取。之後,需要編寫一個規則引擎,這個規則引擎裡面有多個規範相關的檢查工具,解析完成後會將結果產生HTML格式的字串。最後調用郵件服務和定時任務服務去通知相關開發人員。
外掛程式機制設計
$ feflow install <plugin> # 安裝一個外掛程式, --force則會強制安裝$ feflow remove <plugin> # 卸載一個外掛程式$ feflow list # 列舉出所有外掛程式資訊$ feflow list <plugin> # 列舉某個外掛程式資訊
外掛程式機制實現
外掛程式機制的實現包括兩個部分:外掛程式註冊機制和外掛程式發現機制。feflow要求外掛程式必須以feflow-plugin-開頭或者 generator-開頭,generator作為一種特殊的外掛程式,外掛程式代碼以npm包的形式儲存和管理。運行feflow install plugin命令時,會通過npm 的 regsitry檢查是否存在外掛程式,如果存在,會檢查當前外掛程式是否是最新版本。如果不是最新版本,則提示使用者是否需要更新。然後將外掛程式下載到Home目錄下的.feflow目錄(Windows系統為"C:\Users\username\.feflow" 目錄)下的node_modules裡面,並且寫入到設定檔裡面。
本地模組註冊機制
本地模組發現機制
npm 的 registry服務
- npm的查詢服務網址:http://registry.npmjs.org/
- registry網址後面跟上模組名、版本好可以查詢模組詳細資料,包括最新版本,以此來判斷模組是否需要更新。比如:React的最新版本可以通過http://registry.npmjs.org/react/latest 來獲得
- 返回的JSON對象裡面有個dist.tarball屬性,是某個版本的壓縮包地址
常用三方包分享
- osenv 方便的擷取不同系統的環境和目錄配置
- figlet 命令列炫酷的Logo產生器
- meow 命令列協助命令封裝
- inquire 強大的使用者互動
- chalk 讓命令列的output帶有顏色
- easytable 表格資訊展示,用於升級包的提示
- minimlist 使用者輸入的參數解析
- shelljs Node.js執行shell命令
- clui 進度條
遇到的問題
1,windows下使用者未設定HOME環境變數導致報錯
解決辦法: 由於windows下HOME環境變數並非預設存在,因此不能直接使用。判斷process.platform === ‘win32',優先使用HOME變數,否則使用USERPROFILE變數;建議使用osenv這個包。
2,OSX平台運行feflow報錯: env: node\r: No such file or directory
解決辦法: 由於類unix系統的分行符號號為\n,而windows系統為\n\r。修複換行問題。可以在工程根目錄下加.gitattributes檔案,設定* text eol=lf,這樣git提交時就不會講LF轉換成CRLF
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。