寫這個工具的靈感以及場景源於youtube的一次閒聊html
本來咱們寫博客展現shell,例如:安裝運轉docker,一鍵部署腳本,等一些終端操做,咱們須要進行大量的截圖展現給用戶,爲何不能更加直觀方便的生成一個網頁呢?node
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 #自動建立文件,存在默認覆蓋
複製代碼
涉及的技術棧,以及技術選型linux
shelljs 進行CMD處理git
首先我須要拿到 *windows* 或 linux* 的系統回調,使用 *linux* 中的
複製代碼
# 在終端獲取輸入任何命令的流的返回值
sed -n 'p;n;p'
複製代碼
那麼首先考慮 *shelljs API 單發現 對於 sed
處理的不多,並不能知足咱們的需求,可是看到了一個萬能函數 shell.exec
,咱們用他的回調來接受咱們的文本github
fs 或 fs-extradocker
fs-extra 對於 fs 的關係 就像是 lodash 和 underscore 前者封裝了後者,並提供了更好的支持,並作到了向下兼容API 很不容易,咱們主要用它生成一個簡單的 html 文件來分享咱們的 shellshell
commandernpm
咱們選用 nodejs 的 commander 來製做 相似 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
大概是這樣的
完善代碼
完善一下你各單位的邏輯,固然你也能夠選擇寫的更加優雅。
預先注意的問題
我這個項目我會預先想到:保留 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 adduser
複製代碼
接下來會以問答的形式向你瞭解你的用戶名、密碼以及公開的郵箱,以後輸入
```
npm publish
```
複製代碼
401
哦而後看到進度條走,以後組件發佈成功,能夠到 npm 上搜索本身的包了。
npm install share_shell
複製代碼
(取決於你 package.json 當時填寫的項目名)
甚至你執行
cnpm install share_shell
複製代碼
也能下載,淘寶同步的好快呀~
npm i share_shell -g
全世界 全部 用戶均可如下載了node 既然爲咱們提供瞭如此簡潔的方式,那麼咱們能夠作一些更有意義的事情,好比 爲咱們的開源項目 作一個 部署、 發佈、 打包、 測試 、CLI 工具集,能夠作一些平常工做的 批處理 ,好比之前工做中的場景:多臺服務器 負載均衡 查看後端日誌是個麻煩事,須要開不少終端,咱們可不能夠配置好 rsa 或 ssh 合併多個管道,重定向爲一個終端進行查看呢?有了想法咱們就能夠立刻實踐了
flag
,不過都會還回來的🤓