如何用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🤓

最后展现一下新玩具吧

下期见

相关文章
相关标签/搜索