cli本质是一种用户操作界面,根据一些指令和参数来与程序完成交互并得到相应的反馈,好的cli还提供帮助信息,我们经常使用的vue-cli就是一个很好的例子。本文将使用nodejs从头开发并发布一款cli工具,用来查询天气。
项目效果图如下:
配置项目
初始化一个项目:npm init -y
编写入口文件index.js:
module.exports = function(){
console.log('welcome to Anderlaw weather')
}
创建bin文件
bin目录下创建index:
#!/usr/bin/env node
require('../')()
package.json配置bin信息
{
"name": "weather",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": {
"weather": "bin/index"
}
}
然后在根目录(package.json同级)运行npm link
,该操作会将该项目的模块信息和bin指令信息以软链接的形式添加到npm全局环境中:
C:\Users\mlamp\AppData\Roaming\npm\node_modules
下多了一个模块链接C:\Users\mlamp\AppData\Roaming\npm
下多了个名为weather
的cmd文件。
好处是可以更方便地进行本地调试。
然后我们打开终端输入:weather
就会看到welcome to Anderlaw weather
的log信息
解析命令与参数
此处我们使用minimist
库来解析如:npm --save ,npm install 的参数。
安装依赖库 npm i -S minimist
使用process.argv
获取完整的输入信息
使用minimist
解析,例如:
weather today === args:{_:['today']}
weather -h === args:{ h:true }
weather --location 'china' === args:{location:'china'}
首先我们要实现查询今天和明天的天气,执行weather today[tomorrow]
const minimist = require('minimist');
module.exports = ()=>{
const args = minimist(process.argv.slice(2));//前两个是编译器相关路径信息,可以忽略
let cmd = args._[0];
switch(cmd){
case 'today':
console.log('今天天气不错呢,暖心悦目!');
break;
case 'tomorrow':
console.log('明天下大雨,注意带雨伞!');
break;
}
}
以上,如果我们输入weather
就会报错,因为没有取到参数.而且还没添加版本信息,因此我们还需要改善代码
const minimist = require('minimist')
const edition = require('./package.json').version
module.exports = ()=>{
const args = minimist(process