Node.js編寫CLI的實踐

導語:一般而言,Node.js的應用場景有先後端分離、海量web頁面渲染服務、命令行工具和桌面端應用等等。本篇文章選取CLI(Command Line Tools)子領域,來談談Node.js編寫CLI的實踐,讓CLI切實解決實際工程問題。前端

Why Node.js?

經常使用的用來編寫CLI的語言有 python, ruby, perl, Node.js等等。 爲何選取Node.js做爲CLI的語言編寫工具呢?有三個理由:node

  • 對Javascript語言更加熟悉
  • npm 完善的生態系統
  • npm OS無關的包管理機制

主要緣由仍是歸咎於npm 完善的生態,目前npm官方有47.5萬個三方包可供使用,你能夠很方便的使用一些已經編寫的很不錯的輪子去幫你快速開發。另外一方面,你不須要考慮跨平臺的安裝問題,好比OSX上的homebrew、Debian的aptitude、CentOS 上的yum。若是使用shell或者其它語言來編寫CLI,須要針對各個主流OS來作兼容而且發佈到不一樣的平臺。python

看個demo

注: 此處的Logo使用的是figlet這個npm包來幫助生成, demo地址react

npm關聯CLI的基本原理

如何讓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"
  }
…

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命令行參數解析、核心命令以及插件機制。設計插件主要是爲了保持總體功能的穩定,避免頻繁升級;同時開放能力,支持開發者接入,完善總體的生態。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裏面,而且寫入到配置文件裏面。

  • 本地模塊註冊機制

  • 本地模塊發現機制

  • 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

開源信息

相關文章
相關標籤/搜索