首页 > 编程语言 >利用node创建命令行工具

利用node创建命令行工具

时间:2022-11-02 12:33:29浏览次数:70  
标签:node cli 创建 gui 命令 命令行 mycli 工具

什么是命令行工具?

命令行工具(Cmmand Line Interface)简称cli,顾名思义就是在命令行终端中使用的工具。我们常用的 git 、npm、vim 等都是 cli 工具,比如我们可以通过 git clone 等命令简单把远程代码复制到本地

为什么要使用命令行工具?

和 cli 相对的是图形用户界面(gui),windows 环境中几乎都是 gui 工具,而 linux 环境中则几乎都是 cli 工具,因为两者用户不同,gui 侧重于易用,cli 则侧重于效率。对于熟悉 gui 和集成开发环境(IDE)的程序员,可能会觉得很难理解,因为gui工具毕竟更直观,更方便。但事实并非完全如此,因为gui工具主要借助于鼠标的左右键点击、拖拽等几个极其有限的动作,所以它的功能相对而言也是比较容易受局限的,对于简单任务可能的确很方便,但对于某些复杂任务,gui工具会显得力不从心。
例如git操作,git指令可以用参数来轻松完成几十上百种不同功能的操作,但想象一下如果使用gui,完全依赖鼠标点击拖拽,会有多么复杂。另外在任务自动化中,常常会依次使用很多工具,但具体适用哪些工具以及使用工具的先后顺序在不同场景是不一样的,即涉及到工具的排列组合,此时若用gui同样会无比繁琐,而用指令就可以很方便地处理,无非是参数不同而已。
比如说,查看上周哪些js文件没有改动过,以下上面的是命令行方式,下面的是gui方式,很明显命令行方式方便得多。

那么如何开发命令行工具呢?

基本上,使用任何成熟的语言都可以开发 cli 工具,作为一个前端小白,还是 JavaScript 比较顺手,因此我们选用 node 作为开发语言。

步骤1: 创建一个项目


在index.js中输入以下js测试代码:

终端运行node程序,需要先输入node命令,如:

可以正确输出 hello world!,代码顶部的 #!/usr/bin/env node是告诉终端,这个文件要使用 node 去执行

步骤2: 创建一个命令

一般 cli都有一个特定的命令,比如 git,刚才使用的 code 等,我们也需要设置一个命令,就叫 kid 吧!如何让终端识别这个命令呢?很简单,打开 package.json 文件,添加一个字段 bin,并且声明一个命令关键字和对应执行的文件:

即我们声明了一个新的命令mycli,但是该命令目前还不能生效,因为我们并没有安装我们的程序,终端不认识,要想命令最终生效我们需要执行npm link,该命令的作用为通过链接目录和可执行文件,实现npm包命令的全局可执行。
然后再执行 mycli,输出hello world!如下:

至此,一个入门版的命令行工具就已经实现了,虽说没什么实际意义。接下来,我们逐渐完善该工具的功能。

步骤3: 增加查看版本信息功能,对应的指令设计为 mycli -v,接下来产生两个问题:

  • 如何获取到v这个参数
  • 如何获取到版本?
    在 node 程序中,我们通过 process.argv 可获取到命令的参数,以数组返回,修改 index.js,输出该数组:console.log(process.argv)
    然后输入任意命令 如 mycli -v -h -hehe
    控制台会输出如下内容:

    该数组的第三个元素就是我们想要的,上述问题1已经解决,接下来解决第二个问题。版本信息一般存放到package.json文件中的version字段中。package.json可直接require得到。代码如下:

    再来运行 mycli -v 得到如下结果:

步骤4:我们继续增加mycli指令的功能:利用它来初始化一个项目,类似于vue-cli.该项目基于vue-admin-template,故需要从github或gitee下载基本代码结构。完整流程如下:

  1. cd 到一个你想新建项目的目录;
  2. 执行 kid init 命令,根据提示输入项目名称;
  3. cli 通过 git 拉取模版项目代码,并拷贝到项目名称所在目录中;
    为了实现以上流程,我们需要解决下面几个问题:

执行复杂的命令

上面的例子中,我们通过 process.argv 获取到了命令的参数,但是当一个命令有多个参数,或者像新建项目这种需要用户输入项目名称(我们称作“问答”)的命令时,一个简单的swith case 就显得捉襟见肘了。这里我们引用一个专门处理命令行交互的包:commander。
先安装包 npm i commander
然后改造index.js,如下:

运行 mycli -h 输出如下内容:

添加问答操作

接下来我们添加 kid init 的问答操作,这里有需要引入一个新的包:inquirer, 这个包可以通过简单配置让 cli 支持问答交互。首先安装 npm i inquirer
然后修改index.js,如下:

program.command 可以定义一个命令,description 添加一个描述,在 --help 中展示,action 指定一个回调函数执行命令。inquirer.prompt 可以接收一组问答对象,type字段表示问答类型,name 指定答案的key,可以在 answers 里通过 name 拿到用户的输入,问答的类型有很多种,这里我们使用 input,让用户输入项目名称。
运行 mycli init,然后会提示输入项目名称,输入后会打印出来。如下:

接下来,运行shell脚本实现项目模板的下载。

需安装依赖shelljs, 利用该模块可方便地在程序中执行指令。首先安装 npm i shelljs
假定我们想克隆 gitee 上 vue-admin-template 这个项目的代码,并自动安装依赖,改造index.js,在 initAction 函数中加上执行shell脚本的逻辑,如下:

接下来再次运行 mycli init, 并按提示填写项目名称,效果如下:

至此,我们的简易命令行工具开发完成。

参考链接:https://cloud.tencent.com/developer/article/2034395

标签:node,cli,创建,gui,命令,命令行,mycli,工具
From: https://www.cnblogs.com/helloworldhelloweb/p/16850636.html

相关文章

  • java最简单的知识之创建一个简单的windows窗口,利用Frame类
    作者:程序员小冰,微博:​​http://weibo.com/mcxiaobing​​首先给大家看一下效果。当然,就像我们刚学习写代码,写helloworld!很简单,所以,慢慢从简单开始学习吧。这次介绍Fram......
  • 数据透视表你只会手动创建吗?其实可以使用VBA一键生成噢
    Excel的数据透视表是一个非常强大的功能,说起数据透视表初次出现的时候,那是在我们Excel5的版本中间,在后续的版本依次更新迭代,直至目前仍然在改进中。当然我们今天不说基础的......
  • 如何在.NET程序崩溃时自动创建Dump?
    今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示:首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出。现场已......
  • isVnode 判断一个对象是否为 vnode 类型
    functionhasOwn(){returnObject.prototype.hasOwnProperty.call.apply(Object.prototype.hasOwnProperty,arguments)}//判断是否为vnode类型functionisV......
  • 理解NodeJS多进程
    序言一次面试中,我提到自己用过pm2,面试接着问:「那你知道pm2父子进程通信方式吗」。我大概听说pm2有cluster模式,但不清楚父子进程如何通信。面试结束后把NodeJS的多进程重新......
  • 设计模式之创建型模式
    目录一、工厂模式1.1简单工厂模式1.2工厂方法模式1.3抽象工厂方法。二、单例模式2.1.饿汉式2.2.懒汉式2.3双重检索懒汉式的线程安全2.4静态内部类懒汉式单例的线程安......
  • 记一次node节点无法加入K8S集群
    #问题现象:root@small-virtual-machine:~#kubeadmjoin10.0.0.133:6443--tokend2hyl5.5qt5fzjsdbxm2k5o   --discovery-token-ca-cert-hashsha256:d02674df33b......
  • 数据库配置限)不用root用户操作数据库了(为数据库创建用户,并赋予权
    步骤1.为路飞项目创建数据库在mysql终端输入以下代码:createdatabaseluffycharset=utf8;2.创建数据库用户createuser'username'@'host'identifiedby'password'......
  • 创建对象,属性操作
    创建对象letobj={};letobj=newObject();letobj=Object.create(null);//不能不传值,null表示空值letobj=Object.assign(obj1,obj2,obj3);//**操作obj1......
  • 安装node.js教程------深入使用Vue
    教程1、下载nodejs引擎网址:https://nodejs.org/en/download/选择32-bit或者64-bit都行2、下载最新版npm.zip压缩包网址:http://nodejs.org/dist/npm/3、将两者下载在......