commander
开发方向GUI - Graphical User Interface : 图形用户界面office、vscode、浏览器、播放器……CLI - Command-Line Interface:命令行界面,也称为 CUI,字符用户界面虽然没有GUI操作直观,但是CLI更加节省计算机资源(所以一般用于服务器环境)babel、tsc / webpack / vue-cliServer - 服务提供(Web Server、IM……)CLIcommand [subCommand] [options] [arguments]command:命令,比如 vue[subCommand]:子命令,比如 vue create[options]:选项,配置,同一个命令不同选项会有不一样的操作结果,比如 vue -h,vue -v[arguments]:参数,某些命令需要使用的值,比如 vue create myApp选项与参数的区别:选项是命令内置实现,用户进行选择,参数一般是用户决定传入的值选项一般会有全拼与简写形式(具体看使用的命令帮助),比如 --version = -v全拼:以 – 开头 / 简写:以 - 开头选项也可以接受值,值写在选项之后,通过空格分隔多个简写的选项可以连写,开头使用一个 - 即可,需要注意的是,如果有接受值的选项需要放在最后,比如:vue create -d -r <-r的值> myAppvue create -dr <-r的值> myAppcommander命令行开发工具chalk命令行样式风格控制器inquirer交互式命令行工具.parse(argv: string[])解析执行传入的 argv 命令字符串,通常改命令字符串来自用户在命令行的输入,process.argvcommander 同时会默认创建一个 -h, --help 的选项.version(str, flags?)设置版本信息,该方法会自动为命令注册一个 -V, --version 的 optionstr:版本号flags:指定的 option,默认为:”-V, --version”.option(flags, description?, fn?, defaultValue?)设置命令选项flags:选项标记名称,”-v, --version”description:选项使用说明fn:默认值,函数返回值为defaultValue,优先级高于defaultValuedefaultValue:选项默认值,如果需要的话选项属性flags 中的格式可以接收参数-n, --name [val]-n, --name[] 可选<> 必填设置成功以后,会在命令对象下增加一个与全局的同名的属性.action(fn)指定命令要执行的动作行为该函数执行过程会接收到至少一个参数如果命令中带有参数,则是对应的参数列表参数的最后一个永远都是 commander 实例.command(name, desc?, opts?)name:命令的名称,也可以接受值‘create [appName]’desc:简介opts:配置.description(str)命令描述.alias(str)设置命令别名.usage(str)设置或获取当前命令的使用说明
npm i commander
const commander=require('commander')//设置当前的命令的版本// commander.version('1.0.1')//设置当前命令行可以改大小写commander.version('1.0.1','-v,--version')//[]表示可选 <>表示必填// commander.option('-n, --name <val>','打印名称','cccc')commander.option('-n, --name[val]','打印名称',function(val){console.log(val,'000000')return val})//设置命令的动作commander.action(()=>{//console.log(commander)console.log('hi '+commander.rawArgs.name)})//解析来自process.argv上的数据commander.parse(process.argv)// console.log(commander);
ls
/*** ls 输出当前运行的目录文件* ls d:\* 我们可以指定目录**///加载commander方法const commander=require('commander');const fs=require('fs')//设置当前命令工具的版本commander.version('v1.0.0','-v, --version')//子命令没有名字,// const subcommander=commander.command('<path>')// subcommander.option('-n, --name','设置名字')//实现命令具体逻辑commander.action((path)=>{//这里的path参数就是命令中定义的pathconsole.log(path);//当前命令指定的目录下的文件以及文件夹全部显示在控制台上try{const files=fs.readdirSync(path)console.log(files);}catch(e){console.log(e);}})if(process.argv.length<3){process.argv.push(__dirname)}//解析argvcommander.parse(process.argv)
实现-l命令
/*** ls 输出当前运行的目录文件* ls d:\* 我们可以指定目录**///加载commander方法const commander=require('commander');const fs=require('fs')//设置当前命令工具的版本commander.version('v1.0.0','-v, --version')commander.option('-p ,--path [path]','设置要显示的目录',__dirname)//如果选项不接收用户输入的参数值,那么这个选项将以boolean的形式提供给后面的形式使用commander.option('-l ,-list [path]','以列表的形式显示')//实现命令具体逻辑commander.action(()=>{//这里的path参数就是命令中定义的path//option中的变量会挂在当前commander对象的同名属性下try{const files=fs.readdirSync(commander.path)console.log(commander.List);if(commander.List){let output=files.map(file =>{let stat=fs.statSync(commander.path+'/'+file);//是否文件夹let type=stat.isDirectory()?'目录':'文件'return `[${type}] ${file} \r\n`}).join('');console.log(output);}else{console.log('00000000000000000000000000')console.log(files);}}catch(e){console.log(e);}//console.log(commander);})if(process.argv.length<3){process.argv.push(__dirname)}//解析argvcommander.parse(process.argv)
chalk 处理颜色
chalkchalk.<style>[.<style>...](string, [string...])StylesModifiers 文字修饰:bold Colors 文字颜色:red、green、yellow、blue、cyanBackground colors 背景颜色:bgRed、bgGreen、bgYellow、bgBlue、bgCyanchalkColors.hex('#DEADED').keyword('orange').rgb(15, 100, 204)Background colors.hex('#DEADED').keyword('orange').rgb(15, 100, 204)chalk安装npm i chalk / yarn add chalk使用const chalk = require('chalk')得到一个 chalk 对象,通过这个对象,我们就可以给控制台中的文字加上各种样式了,就像css一样
Inquirer
交互式命令,提问用户,收集用户输入数据 安装
npm i inquirer
使用
require(‘inquirer’)
inquirer.prompt(questions).then(answers=>{
…
})
const inquirer=require('inquirer')//提问用户,与用户进行命令行的交互// prompt数组中存在一个指定格式的对象/*Inquirerquestionstype:提问类型,input, confirm, list, rawlist, expand, checkbox, password, editorname:问题名称,供程序后续使用message:问题文字,给用户看的default:默认值choices:选项validate:输入验证filter:数据过滤*/inquirer.prompt([{type:'input',name:'username',message:'请输入姓名',default:'wanzi',validate(val){if(val.trim()==''){return '应用名称不能为空'}else{return true}},//对用户输入的数据或选择的数据进行过滤filter(val){return val.toLowerCase()}},{type:'confirm',name:'xingbie',message:'是否同性恋',default:false},{type:'list',name:'gongzi',message:'你的工资范围',choices:['100-1000','1000-2000'],default:1},{type:'rawlist',name:'gongzi2',message:'你的工资范围',choices:['100-1000','1000-2000'],default:1},{type:'checkbox',name:'tools',message:'你感兴趣的话题',choices:[{name:'美妆',value:'meizhuang',checked:true},{name:'明星',value:'mingxing'},{name:'八卦',value:'bagua'}]}]).then(answers=>{console.log(answers);})
