最近开发了一些命令行工具,准备在团队分享一下开发经验,顺便写了篇文章。
什么是命令行?
Command Line Interface,一种通过命令行来交互的工具或者应用。
比如:mkdir、cd、scp、vue-cli、webpack、npm、gulp等。
使用CLI的好处?
减少低级重复劳动、提高开发效率、规范develop workflow
开始发车,4步完成CLI开发!
-
编写脚本、测试运行
新建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
测试代码执行结果如下

-
设置运行时
在小黑窗执行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}`)
}
-
分配执行权限
执行chmod +x index.js
给你编写的脚本分配可执行权限,分配完后直接执行一下index.js
,发现可以执行了,有木有
image.png
-
设置环境变量
执行$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
,然后就可以找到自定义的命令了

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

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

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
效果如下

4、
npm login
+ npm publish
发布npm包
完工~
网友评论