導語:一般而言,Node.js的應用場景有先後端分離、海量web頁面渲染服務、命令行工具和桌面端應用等等。本篇文章選取CLI(Command Line Tools)子領域,來談談Node.js編寫CLI的實踐,讓CLI切實解決實際工程問題。前端
經常使用的用來編寫CLI的語言有 python, ruby, perl, Node.js等等。 爲何選取Node.js做爲CLI的語言編寫工具呢?有三個理由:node
主要緣由仍是歸咎於npm 完善的生態,目前npm官方有47.5萬個三方包可供使用,你能夠很方便的使用一些已經編寫的很不錯的輪子去幫你快速開發。另外一方面,你不須要考慮跨平臺的安裝問題,好比OSX上的homebrew、Debian的aptitude、CentOS 上的yum。若是使用shell或者其它語言來編寫CLI,須要針對各個主流OS來作兼容而且發佈到不一樣的平臺。python
注: 此處的Logo使用的是figlet這個npm包來幫助生成, demo地址react
如何讓Node.js編寫的包可執行?其實很簡單,只須要在package.json裏面增長一個bin字段。模塊發佈到npm上後,開發者安裝這個包的時候會檢查是否有bin字段,若是有bin字段則會使用軟連接的方式建立能夠全局使用的命令。git
若是模塊採用全局安裝的方式,對於類unix系統,會在/usr/local/bin目錄建立軟連接,對於windows系統,在C:\Users\username\AppData\Roaming\npm目錄建立軟連接。github
若是模塊採用局部安裝的方式,則會在項目內的./node_modules/.bin目錄建立軟連接。web
配置好的package.json以下:shell
… "description": "A command line tool aims to improve front-end engineer workflow.", "main": "lib/index.js", "bin" : { "feflow" : "./bin/feflow" } …
$ 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整體分爲3個模塊,包括parser命令行參數解析、核心命令以及插件機制。設計插件主要是爲了保持總體功能的穩定,避免頻繁升級;同時開放能力,支持開發者接入,完善總體的生態。npm
在一個工程項目中,有各類各樣的規範,好比項目命名規範、描述規範、目錄結構規範、README.md規範,是否增長基本監控等等。編寫掃描器scanner,對某個Group裏面的全部業務項目進行掃描,將不符合規範的倉庫和不符合規範的地方列舉出來,而且撈出責任人。最後經過郵件及定時任務發送給相關同窗,而且敦促修改。掃描器流程圖以下:json
首先,須要一個任務隊列,隊列裏面存放不一樣的掃描任務。每一個掃描任務依賴相關的文件信息或者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裏面,而且寫入到配置文件裏面。
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