天天看點

Node.js 編寫 CLI 的實踐

本文作者:ivweb 程柳鋒

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

常用的用來編寫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來做相容并且釋出到不同的平台。

Node.js 編寫 CLI 的實踐

注: 此處的Logo使用的是figlet這個npm包, demo位址

如何讓Node.js編寫的包可執行?其實很簡單,隻需要在package.json裡面增加一個bin字段。子產品釋出到npm上後,開發者安裝這個包的時候會檢查是否有bin字段,如果有bin字段則會使用軟連結的方式建立可以全局使用的指令。

如果子產品采用全局安裝的方式,對于類unix系統,會在/usr/local/bin目錄建立軟連結,對于windows系統,在C:\Users\username\AppData\Roaming\npm目錄建立軟連結。

如果子產品采用局部安裝的方式,則會在項目内的./node_modules/.bin目錄建立軟連結。

配置好的package.json如下:

Feflow總體分為3個子產品,包括parser指令行參數解析、核心指令以及插件機制。設計插件主要是為了保持整體功能的穩定,避免頻繁更新;同時開放能力,支援開發者接入,完善整體的生态。

Node.js 編寫 CLI 的實踐

在一個工程項目中,有各種各樣的規範,比如項目命名規範、描述規範、目錄結構規範、README.md規範,是否增加基本監控等等。編寫掃描器scanner,對某個Group裡面的所有業務項目進行掃描,将不符合規範的倉庫和不符合規範的地方列舉出來,并且撈出責任人。最後通過郵件及定時任務發送給相關同學,并且敦促修改。掃描器流程圖如下:

Node.js 編寫 CLI 的實踐

首先,需要一個任務隊列,隊列裡面存放不同的掃描任務。每個掃描任務依賴相關的檔案資訊或者Commit資訊,這個時候需要調用Git code提供的三方API進行檔案資訊拉取。之後,需要編寫一個規則引擎,這個規則引擎裡面有多個規範相關的檢查工具,解析完成後會将結果生成HTML格式的字元串。最後調用郵件服務和定時任務服務去通知相關開發者。

插件機制的實作包括兩個部分:插件注冊機制和插件發現機制。feflow要求插件必須以feflow-plugin-開頭或者 generator-開頭,generator作為一種特殊的插件,插件代碼以npm包的形式存儲和管理。運作feflow install plugin指令時,會通過npm 的 regsitry檢查是否存在插件,如果存在,會檢查目前插件是否是最新版本。如果不是最新版本,則提示使用者是否需要更新。然後将插件下載下傳到Home目錄下的.feflow目錄(Windows系統為"C:\Users\username.feflow" 目錄)下的node_modules裡面,并且寫入到配置檔案裡面。

本地子產品注冊機制

Node.js 編寫 CLI 的實踐

本地子產品發現機制

Node.js 編寫 CLI 的實踐

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

原文連結:http://www.ivweb.io/topic/5918069a869edc1f59d6ba13