持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
上几篇文章讲解了脚手架的准备阶段
接下来开始进行脚手架命令的注册阶段
我们使用Node第三方库 commander 来进行命令的注册
先看个commander的示例
const commander = require('commander')
const program = new commander.Command()
const pkg = require('./package.json')
program
.name(Object.keys(pkg.bin)[0])
.usage('<command> [options]')
.version(pkg.version)
.option('-d,--debug','是否开启调试模式', false)
.option('-e, --envName <envName>', '获取环境变量名称')
.parse(process.argv);
在终端输入,就能看到我们注册的--debug命令
cli --help
下面开始命令注册
命令注册
// 命令注册
function registryCommand(){
program
.name(Object.keys(pkg.bin)[0])
.usage('<command> [options]')
.version(pkg.version)
.option('-d, --debug','是否开启调试模式', false);
// 开启debug模式
program.on('option:debug', function(){
if(program._optionValues.debug){
process.env.LOG_LEVEL = 'verbose'
}else{
process.env.LOG_LEVEL = 'info'
}
log.level = process.env.LOG_LEVEL;
log.verbose('test')
})
// 对未知命令监听
program.on('command:*', function(obj){
console.log(obj)
const availableCommands = program.commands.map(cmd => cmd.name())
console.log(colors.red(`未知的命令:${obj[0]}`))
if(availableCommands.length > 0){
console.log(colors.red(`可用命令:${availableCommands.join(',')}`))
}
})
// 没有输入命令,进行提示
if(program.args && program.args.length < 1){
program.outputHelp()
console.log()
}
program.parse(process.argv)
}
在这里进行了4个命令的注册,下面分别讲解下
是否开启debug模式
program
.name(Object.keys(pkg.bin)[0])
.usage('<command> [options]')
.version(pkg.version)
.option('-d, --debug','是否开启调试模式', false);
通过在option中,第一个参数是命令,-d和--debug是相等的,-d是--debug的缩写。第二个参数是对这个命令的描述。第三个参数是默认值,这里为false,表示默认不开启调试模式。
开启debug模式
// 开启debug模式
program.on('option:debug', function(){
if(program._optionValues.debug){
process.env.LOG_LEVEL = 'verbose'
}else{
process.env.LOG_LEVEL = 'info'
}
log.level = process.env.LOG_LEVEL;
log.verbose('test')
})
这里我们使用commander的高级命令: option: debug。在这个回调函数中,可以通过program._optionValues.debug来获取是否开启debug模式,如果开启,则将环境变量中的LOG_LEVEL变成verbose,否则变成info,也就是普通模式。最后我们需要将环境变量的Log_LEVEL赋值给自定义log库的log.level。这样就实现了开始degbu模式。
对未知命令的监听
// 对未知命令监听
program.on('command:*', function(obj){
console.log(obj)
const availableCommands = program.commands.map(cmd => cmd.name())
console.log(colors.red(`未知的命令:${obj[0]}`))
if(availableCommands.length > 0){
console.log(colors.red(`可用命令:${availableCommands.join(',')}`))
}
})
这里也是使用commander高级用法:command:* ,通过这个能获取所有注册的命令。只要不在这里的命令,统一视为未知命令,并给用户进行提示。
没命令进行提示
// 没有输入命令,进行提示
if(program.args && program.args.length < 1){
program.outputHelp()
console.log()
}
这里可以通过program.args来获取输入的命令,如果长度为0,则表示没有输入命令。然后可以通过program.outputhelp()获取帮助文档,给用户显示出来目前已经注册的命令。