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

灵感

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

使用场景

原本我们写博客展示shell,例如:安装运转docker,一键部署脚本,等一些终端操作,我们需要进行大量的截图展示给用户,为什么不能更加直观方便的生成一个网页呢?

如何使用

  • 安装
  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 #自动创建文件,存在默认覆盖

如何基于node制作自己的跨平台工具

① 制作前的思考

  • 涉及的技术栈,以及技术选型
  • shelljs 进行CMD处理

    首先我需要拿到windowslinux 的系统回调,使用 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 大概是这样的

  • 完善代码

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

  • 预先注意的问题

    我这个项目我会预先想到:保留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 淘宝源,否则 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的微服务小型实践,总之想做的事情真的很多。

关于我

庄文达:全栈开发攻城狮

  • 就是爱学习,我还要刺激大家一起学习

    如何用node开发自己的cli工具的更多相关文章

    1. 用node编写自己的cli工具

      工作中接到新项目,开发前都需要先规划项目目录,然后一个个创建文件,搭建sass编译环境,下载jquery,Swiper等类库... 这些准备工作都要花上不少时间.每做一个项目,都会遇到同样的问题,再重 ...

    2. 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)

      在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...

    3. node编写自己的cli

      用node编写自己的cli工具   工作中接到新项目,开发前都需要先规划项目目录,然后一个个创建文件,搭建sass编译环境,下载jquery,Swiper等类库... 这些准备工作都要花上不少时间.每 ...

    4. ubuntu 18.04安装clojure工程的cli工具lein

      官网的安装过程https://leiningen.org/#install 是文字描述,并不够lazy. 我仿照code,chrome nodejs的方式,给出下面的命令行安装过程 wget http ...

    5. 用node编写cli工具

      cli是command-line interface的缩写,即命令行工具,常用的vue-cli, create-react-app, express-generator 等都是cli工具. 本文以自己 ...

    6. Node开发项目管理工具 Grunt 对比 Gulp

      转自Gulp vs Grunt 1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Mav ...

    7. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

      原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

    8. 用一次就会爱上的cli工具开发

      本文转载自用一次就会爱上的cli工具开发 写在前面 最近接手任务--使用nodejs开发一个公司内部使用的cli工具,简而言之就是输入一行命令快速搭建好项目结构,也可以通过不同的命令引入不同的文件. ...

    9. 构建工具是如何用 node 操作 html/js/css/md 文件的

      构建工具是如何用 node 操作 html/js/css/md 文件的 从本质上来说,html/js/css/md ... 源代码文件都是文本文件,文本文件的内容都是字符串,对文本文件的操作其实就是对 ...

    随机推荐

    1. Java 线程状态有哪些?

      线程状态有 5 种,新建,就绪,运行,阻塞,死亡.关系图如下: 1. 线程 start 方法执行后,并不表示该线程运行了,而是进入就绪状态,意思是随时准备运行,但是真正何时运行,是由操作系统决定的,代 ...

    2. Java实体类之间的映射(一对一关系)

      如下描述:一个人有有一个身份证 一个身份证只能属于某一个人 /** 一个人有有一个身份证 一个身份证只能属于某一个人 */ class Person{ //人 private String name; ...

    3. ASP 数据库分页

      <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Response.buffer=false %> ...

    4. 十三、python列表方法汇总

      '''1.append():更新列表'''l=[]l.append('111')l.append('[123,456]')print l-------------------------------- ...

    5. fedora如何使用themes主题?

      DBus: 是一个 local 的IPC 进程间通信机制 如果是(一对一) 多对多的通信, 则DBUS 后台充当了一个路由器的角色. ibus: 是包含: python gtk dbus的 scim- ...

    6. iView 实战系列教程(21课时)_1.iView 实战教程之配置篇_图片优化

      首先需要安装vue cli 3.0版本 点击添加插件, 输入iview 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动 ...

    7. Elastic Search笔记

      目录 1.简介 2.概念和工具使用 2.1 基本概念 2.2 使用kibana 3.操作索引和数据 2.3 索引 2.4 索引映射到文档 2.5 新增数据 2.6 修改数据 2.7 删除数据 4. 搜 ...

    8. android window(三)lWindow添加流程

      http://androidxref.com/6.0.1_r10/xref/frameworks/base/services/core/java/com/android/server/wm/Windo ...

    9. MVC 源码系列之路由(二)

      MVCParseData和Match方法的实现 ### ParseData 那么首先要了解一下ParseData. //namespace Route public string Url { get ...

    10. 【minicap】基于图像识别的手机端UI自动化测试的截图方式更新

      minicap属于STF框架的一个工具,可以高速截图.同步手机屏幕至浏览器等   为什么用minicap截图: 经过试验,截同一个屏幕的一张图,adb shell screencap速度为2.9秒,而 ...