如何用node開發自己的cli工具
靈感
寫這個工具的靈感以及場景源於youtube的一次閒聊
使用場景
原本我們寫部落格展示shell,例如:安裝運轉docker,一鍵部署指令碼,等一些終端操作,我們需要進行大量的截圖展示給使用者,為什麼不能更加直觀方便的生成一個網頁呢?
如何使用
- 安裝
sudo npm install share_shell -g
複製程式碼
- 幫助
tw --help #1.0暫時用這個命令,沒想到好的縮寫
複製程式碼
- 檢視版本
tw --version || tw -v
複製程式碼
- 使用
# tw share "要展示的命令" -p "路徑"
# 例如想 docker ps -a 秀一波你的docker容器
tw share "docker ps -a" 或 tw s "docker ps -a" # 預設生成 share_you_shell.html 到當前目錄
# 還可以指定路徑
tw share "ls -all" -p /usr/local/html/share_shell.html #自動建立檔案,存在預設覆蓋
複製程式碼
如何基於node製作自己的跨平臺工具
① 製作前的思考
-
涉及的技術棧,以及技術選型
-
shelljs 進行CMD處理
首先我需要拿到 *windows* 或 linux* 的系統回撥,使用 *linux* 中的 複製程式碼
# 在終端獲取輸入任何命令的流的返回值
sed -n 'p;n;p'
複製程式碼
那麼首先考慮 *shelljs API 單發現 對於 sed
處理的很少,並不能滿足我們的需求,但是看到了一個萬能函式 shell.exec
,我們用他的回撥來接受我們的文字
-
fs 或 fs-extra
fs-extra 對於 fs 的關係 就像是 lodash 和 underscore 前者封裝了後者,並提供了更好的支援,並做到了向下相容API 很不容易,我們主要用它生成一個簡單的 html 檔案來分享我們的 shell
-
commander
我們選用 nodejs 的 commander 來製作 類似 git docker 風格的 cli 命令列工具 , 因為沒有其他更好的選擇
-
其他
我個人用了 lodash string 進行了偷懶操作,缺點是增加了兩個依賴,優點是 快~
② 寫程式碼前的準備工作
-
初始化
npm init
初始化生成標準的package.json
檔案,包含你的git
資訊,釋出npm
能找到你的描述,聯絡方式,版本號等。 -
新建bin資料夾
這是一個規範,可執行工具的老家。新建一個
tw.js
,因為是印表機風格的,所以瞎起了個名字 取typeWriter
首字母
③ 先定義一下基本的終端命令
-
編輯
tw.js
var program = require('commander'); var appInfo = require('../package.json'); program.version(appInfo.version) // 拿到 package.json 你定義的版本 program .command('share <shell>') // 定義你的command .alias('s') // 縮寫 .description('Enter the "shell" you want to convert and include it in \" \" ') // 描述 .option("-p, --path <path>", "Enter you html path , default ./share_you_shell.html") // option 字命令,可以無限多個 .action(function (cmd, options) { // 拿到cli輸入的option子命令,沒有可以預設 var path = typeof options.path == 'string' ? options.path : "./share_you_shell.html" // 執行你的操作 ↓ // 執行cli的command exec_shell.exec(cmd, (res) => { // 回撥的res根據格式轉為陣列 var res_arr = S(res).lines() // 針對陣列你的邏輯處理一波陣列 let str = format.toTypedFormat([cmd].concat(res_arr)) // 非同步製作你的檔案,傳入路徑 file.mkfile(str, path) }) }).on('--help', function () { // --help commander 有預設處理,一般這部分無事可做,你還想幹啥? }); program.parse(process.argv); 複製程式碼
輸入 tw -- help
大概是這樣的
-
完善程式碼
完善一下你各單位的邏輯,當然你也可以選擇寫的更加優雅。
-
預先注意的問題
我這個專案我會預先想到:保留 shell 的轉譯符 使用 pre 原型輸入
\n \t
,處理一下 scroll 保持底部,最後隨便找一個類似 typewriterjs 開源庫,按照他的風格生成一下程式碼段就可以啦
④ 測試一下
-
寫完了?
node /bin/tw.js share "tree -L 2" -p xxx
測試一下,(你們可能沒有安裝tree
,換任何可執行的其他命令,長ping
除外) -
全域性測一下
我們最終是要釋出到
npm
上的,可以讓使用者-g
安裝,自己應該先測試一下,首先:確保你在
package.json
檔案中新增了bin
節點。並指明瞭主程式,像我這樣。"bin": { "tw": "./bin/tw.js" }, 複製程式碼
-
執行
sudo npm install . -g 複製程式碼
-
執行
tw share "tree -L 2" -p xxx/xxx/xx.html 複製程式碼
如果生成了
xx.html
,恭喜你,可以釋出了
④如何釋出到 npm
-
專案已經準備好了,接下來可以著手釋出了。首先npm上註冊賬號,別忘了去郵箱驗證。然後輸入:
npm adduser 複製程式碼
接下來會以問答的形式向你瞭解你的使用者名稱、密碼以及公開的郵箱,之後輸入
```
npm publish
```
複製程式碼
- 注意!!
釋出 npm 的源別不要是 cnpm 淘寶源,否則 response
401
哦
然後看到進度條走,之後元件釋出成功,可以到 npm 上搜尋自己的包了。
npm install share_shell
複製程式碼
(取決於你 package.json 當時填寫的專案名)
甚至你執行
cnpm install share_shell
複製程式碼
也能下載,淘寶同步的好快呀~
npm i share_shell -g
全世界 所有 使用者都可以下載了
⑤ 引發的思考
- 思考
node 既然為我們提供瞭如此簡潔的方式,那麼我們可以做一些更有意義的事情,比如 為我們的開源專案 做一個 部署、 釋出、 打包、 測試 、CLI 工具集,可以做一些日常工作的 批處理 ,比如以前工作中的場景:多臺伺服器 負載均衡 檢視後端日誌是個麻煩事,需要開很多終端,我們可不可以配置好 rsa 或 ssh 合併多個管道,重定向為一個終端進行檢視呢?有了想法我們就可以馬上實踐了
最後展示一下新玩具吧
關於我
莊文達:全棧開發攻城獅
- 就是愛學習,我還要刺激大家一起學習?
- 沒事喜歡造造輪子?
- 寫寫部落格?
- 彔彔視訊分享?
- 做一些技術實踐?
- 立一立
flag
,不過都會還回來的? - 目前在寫 bbs?