什么是命令行工具?

命令行工具(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

原文地址:http://www.cnblogs.com/helloworldhelloweb/p/16850636.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性