如何用node開發自己的cli工具

莊文達發表於2018-08-08

如何用node開發自己的cli工具

靈感

寫這個工具的靈感以及場景源於youtube的一次閒聊

如何用node開發自己的cli工具

使用場景

原本我們寫部落格展示shell,例如:安裝運轉docker,一鍵部署指令碼,等一些終端操作,我們需要進行大量的截圖展示給使用者,為什麼不能更加直觀方便的生成一個網頁呢?

如何使用

  • 安裝
  sudo npm install share_shell -g
複製程式碼
  • 幫助
  tw --help   #1.0暫時用這個命令,沒想到好的縮寫
複製程式碼

tw --help

  • 檢視版本
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 ,我們用他的回撥來接受我們的文字

  • fsfs-extra

    fs-extra 對於 fs 的關係 就像是 lodashunderscore 前者封裝了後者,並提供了更好的支援,並做到了向下相容API 很不容易,我們主要用它生成一個簡單的 html 檔案來分享我們的 shell

  • commander

    我們選用 nodejscommander 來製作 類似 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 大概是這樣的

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 工具集,可以做一些日常工作的 批處理 ,比如以前工作中的場景:多臺伺服器 負載均衡 檢視後端日誌是個麻煩事,需要開很多終端,我們可不可以配置好 rsassh 合併多個管道,重定向為一個終端進行檢視呢?有了想法我們就可以馬上實踐了

最後展示一下新玩具吧

如何用node開發自己的cli工具

關於我

莊文達:全棧開發攻城獅

  • 就是愛學習,我還要刺激大家一起學習?
  • 沒事喜歡造造輪子?
  • 寫寫部落格?
  • 彔彔視訊分享?
  • 做一些技術實踐?
  • 立一立flag,不過都會還回來的?
  • 目前在寫 bbs?

最後展示一下新玩具吧

如何用node開發自己的cli工具

下期見

相關文章