开发命令行工具CLI

最近开发了一些命令行工具,准备在团队分享一下开发经验,顺便写了篇文章。

什么是命令行?

Command Line Interface,一种通过命令行来交互的工具或者应用。
比如:mkdir、cd、scp、vue-cli、webpack、npm、gulp等。

使用CLI的好处?

减少低级重复劳动、提高开发效率、规范develop workflow

开始发车,4步完成CLI开发!

  1. 编写脚本、测试运行
    新建index.js内容如下
const os = require("os")
const ip = os.networkInterfaces().en0[1].address
const options = process.argv.slice(2)
if (options[0] === '-v') {
    console.log('v1.0.0')
} else {
    console.log(`your ip is: ${ip}`)
}

执行node index.js测试代码执行结果如下

image.png

  1. 设置运行时
    在小黑窗执行which env,将返回结果设置到第1步脚本的第一行,指定脚本的解释程序(env可以在系统的PATH目录中查找脚本解释器安装目录)
    image.png

    然后,你的代码就变成了下面这样
#!/usr/bin/env node

const os = require("os")
const ip = os.networkInterfaces().en0[1].address
const options = process.argv.slice(2)
if (options[0] === '-v') {
    console.log('v1.0.0')
} else {
    console.log(`your ip is: ${ip}`)
}
  1. 分配执行权限
    执行chmod +x index.js给你编写的脚本分配可执行权限,分配完后直接执行一下index.js,发现可以执行了,有木有

    image.png

  2. 设置环境变量
    执行$PATH找环境变量

    image.png

小知识:usr 指 Unix System Resource,而不是User
通常/usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变
/usr/local/bin目录是给用户放置自己的可执行程序的地方,推荐放在这里,不会被系统升级而覆盖同名文件
如果两个目录下有相同的可执行程序,谁优先执行受到PATH环境变量的影响,比如我的电脑PATH变量为/usr/local/mongodb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:“/usr/libexec/java_home”::/platform-tools:/tools:“/usr/libexec/java_home”:“/usr/libexec/java_home”/bin:/usr/local/mongodb/bin:/Users/qianxuemin/bin/
这里/usr/local/bin优先于/usr/bin

link可执行脚本到环境变量ln index.js /usr/local/bin/qianxuemin-ip,然后就可以找到自定义的命令了

image.png

当然,也可以使用自定义的命令qianxuemin-ip了


image.png

技巧

  1. 收集参数,使用api:process.argv
  2. 输出彩色文字及背景:
    \033[30m 至 \033[37m 设置前景色
    \033[40m 至 \033[47m 设置背景色
    比如
console.log("\033[34m\033[40m我是彩色\033[30m\033[47m")

image.png

3.删除刚刚开发的命令行工具 rm "which qianxuemin-ip"
4.开发命令行工具常用的库
commander 参数解析
chalk 文字加颜色
shelljs 运行shell命令
Inquirer 交互信息收集


通过npm项目来开发命令行工具

有了上面的知识,下面分享一下通过npm项目来开发命令行工具的步骤
1、npm init -y初始化项目,
目录如下

.
├── index.js
├── package-lock.json
└── package.json

index.js还是上面描述的文件、package.json设置bin字段

{
  "name": "qianxuemin-ip-01",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
    "qianxuemin-ip-01": "./index.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

2、 执行npm link link到npm root -g对应的目录下
3、然后执行qianxuemin-ip-01效果如下

image.png

4、npm login + npm publish发布npm包

完工~

你可能感兴趣的:(开发命令行工具CLI)