如何用 node 开发自己的 cli 工具

本贴最后更新于 2297 天前,其中的信息可能已经沧海桑田

如何用 node 开发自己的 cli 工具

灵感

写这个工具的灵感以及场景源于 youtube 的一次闲聊

使用场景

原本我们写博客展示 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` ,我们用他的回调来接受我们的文本
    
  • fs 或 fs-extra

    fs-extra 对于 fs 的关系呢 就像是 lodashunderscore 前者封装了后者,并提供了更好的支持,并做到了向下兼容 API 很不容易,我们主要用它生成一个简单的 html 文件来分享我们的 shell

  • commander

    我们选用 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 大概是这样的

tw --help

  • 完善代码

    完善一下你各单位的逻辑,当然你也可以选择写的更加优雅。

  • 预先注意的问题

    我这个项目我会预先想到:保留 shell的转译符 使用 pre 原型输入 \n \t,处理 一下scroll 保持底部,最后随便找一个类似 typewriterjs 开源库,按照他的风格生成一下就可以

④ 如何发布到 npm

  • 项目已经准备好了,接下来可以着手发布了。首先 npm 上注册账号,别忘了去邮箱验证。然后输入:

    npm adduser
    

接下来会以问答的形式向你了解你的用户名、密码以及公开的邮箱,之后输入

```
npm publish
```
  • 注意!!
    发布 npm 的源别是 cnpm 淘宝源,否则 401

然后看到进度条走,之后组件发布成功,可以到 npm 上搜索自己的包了。

npm install share_shell (取决于你 package.json 当时填写的项目名)
甚至你 cnpm install share_shell 也能下载,淘宝同步 快。

  • npm i share_shell -g 全世界 所有 用户都可以下载了

⑤ 引发的思考

  • 思考
    node 既然为我们提供了如此简洁的方式,那么我们可以做一些更有意义的事情,比如 为我们的开源项目 做一个 部署发布打包测试CLI 工具集,可以做一些日常工作的 批处理 ,比如以前工作中的场景:多台服务器 负载均衡 查看后端日志是个麻烦事,需要开很多终端,我们可不可以配置好 rsassh 合并多个 管道 重定向为一个终端进行查看呢?

feature(flag)

  • 做一个推荐

1.0 不够好,也就能个人 blog 站点用用,分享给别人瞧瞧,我打算下一步 2.0 发表到我即将完成的 目前技术栈比较主流的 bbs new-bee 上, 顺便推广一波,当然顺便点个 star 支持一下也很感激,当然这也是我首次提及此项目,此项目涉及到 docker webpack vue spring-boot shell脚本 各种中间件 各种前沿ui库脚手架 未来甚至可能尝试基于 docker 的微服务小型实践,总之想做的事情真的很多。

关于我

庄文达:全栈开发攻城狮

  • 就是爱学习,我还要刺激大家一起学习:nerd:
  • 没事喜欢造造轮子:nerd:
  • 写写博客:nerd:
  • 录录视频分享:nerd:
  • 做一些技术实践:nerd:
  • 立一立 flag,不过都会还回来的:nerd:
  • 目前在写 bbs:nerd:

下一篇文章

  • 我会给大家讲述一下 全栈工程师的自我修养 或者大方向可以说 web全栈工程师的自我修养 和需要掌握的 技术栈 ,也是分享我这么多年的积累

最后展示一下新玩具吧

下期见

  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 43 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    已经把这个词移除违禁词库了,感谢反馈 😂

  • 其他回帖
  • pkwenda
    作者

    友情提示:黑客派不能发布 他妈 算是关键词,幸亏我用二分查找法快速定位问题,建议提示那个关键词。

    1 回复