如何用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. 洛谷P2657 windy数

      传送 裸的数位dp 看这个题面,要求相邻两个数字之差至少为2,所以我们记录当前填的数的最后一位 同时要考虑毒瘤的前导0.如果填的数前面都是0,则这一位填0是合法的. emmm具体的看代码叭 #incl ...

    2. Vue引入Jquery和Bootstrap

      一.引入jquery包 npm i jquery 二.配置jquery 在webpack.base.conf.js中加载juery插件  所以要配置该文件 三.引入Bootstrap npm i bo ...

    3. (转)linux nc命令使用详解

      linux nc命令使用详解 原文:https://www.2cto.com/os/201306/220971.html 功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网 ...

    4. python实现格式化输出9*9乘法表

      # python 9*9 乘法表 for i in range(1,10): for j in range(1,i+1): print("%s*%s=%s"%(i,j,i*j),e ...

    5. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_3_Collection集合常用功能

      Collection在java.util包下面 只学里面几个比较重要的,List和Set 一共7个共性方法 接口指向实现类,多态的形式. 输出这个结合打印出一个空的数组.说明它重写了toString的 ...

    6. Python Error: “ImportError: No module named six”,用自动安装解决依赖问题

      在初次运行带有matplotlib包的程序时,被告知了缺少模块(如标题所示).搜索调查后发现在自己安装的python中确实缺少此安装包,接下来,进行了下载.安装.运行,又少了一个模块,再下载.再运行, ...

    7. 用 Redis 实现 PHP 的简单消息队列

      参考:PHP高级编程之消息队列 消息队列就是在消息的传输过程中,可以保存消息的容器. 常见用途: 存储转发:异步处理耗时的任务 分布式事务:多个消费者消费同一个消息队列 应对高并发:通过消息队列保存任 ...

    8. 16/7/8_PHP-单引号和双引号的区别

      在PHP中,字符串的定义可以使用英文单引号' ',也可以使用英文双引号" ". 但是必须使用同一种单或双引号来定义字符串,如:'Hello World"和"He ...

    9. PHP 图片+文字+二维码生成小程序分享海报

      思路: 1.请求微信接口获取一定尺寸微信二维码 2.准备海报主图,处理尺寸按比例缩放 3.准备分享语录,计算段落高度 4.生成海报:创建画布,分写别入按顺序和位置写入二维码.图片.文字等 5.保存海报 ...

    10. TensorFlow学习笔记4-线性代数基础

      TensorFlow学习笔记4-线性代数基础 本笔记内容为"AI深度学习".内容主要参考<Deep Learning>中文版. \(X\)表示训练集的设计矩阵,其大小为 ...