如何用node開發本身的cli工具

如何用node開發本身的cli工具

靈感

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

使用場景

本來咱們寫博客展現shell,例如:安裝運轉docker,一鍵部署腳本,等一些終端操做,咱們須要進行大量的截圖展現給用戶,爲何不能更加直觀方便的生成一個網頁呢?node

如何使用

  • 安裝
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製做本身的跨平臺工具

① 製做前的思考

  • 涉及的技術棧,以及技術選型linux

  • shelljs 進行CMD處理git

    首先我須要拿到 *windows* 或 linux* 的系統回調,使用 *linux* 中的 
    複製代碼
# 在終端獲取輸入任何命令的流的返回值
sed -n 'p;n;p'
複製代碼

那麼首先考慮 *shelljs API 單發現 對於 sed 處理的不多,並不能知足咱們的需求,可是看到了一個萬能函數 shell.exec ,咱們用他的回調來接受咱們的文本github

  • fsfs-extradocker

    fs-extra 對於 fs 的關係 就像是 lodashunderscore 前者封裝了後者,並提供了更好的支持,並作到了向下兼容API 很不容易,咱們主要用它生成一個簡單的 html 文件來分享咱們的 shellshell

  • commandernpm

    咱們選用 nodejscommander 來製做 相似 git docker 風格的 cli 命令行工具 , 由於沒有其餘更好的選擇json

  • 其餘windows

    我我的用了 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 合併多個管道,重定向爲一個終端進行查看呢?有了想法咱們就能夠立刻實踐了

最後展現一下新玩具吧

關於我

莊文達:全棧開發攻城獅

  • 就是愛學習,我還要刺激你們一塊兒學習🤓
  • 沒事喜歡造造輪子🤓
  • 寫寫博客🤓
  • 彔彔視頻分享🤓
  • 作一些技術實踐🤓
  • 立一立flag,不過都會還回來的🤓
  • 目前在寫 bbs🤓

最後展現一下新玩具吧

下期見

相關文章
相關標籤/搜索