commander

  1. 开发方向
  2. GUI - Graphical User Interface 图形用户界面
  3. officevscode、浏览器、播放器……
  4. CLI - Command-Line Interface:命令行界面,也称为 CUI,字符用户界面
  5. 虽然没有GUI操作直观,但是CLI更加节省计算机资源(所以一般用于服务器环境)
  6. babeltsc / webpack / vue-cli
  7. Server - 服务提供(Web ServerIM……)
  8. CLI
  9. command [subCommand] [options] [arguments]
  10. command:命令,比如 vue
  11. [subCommand]:子命令,比如 vue create
  12. [options]:选项,配置,同一个命令不同选项会有不一样的操作结果,比如 vue -hvue -v
  13. [arguments]:参数,某些命令需要使用的值,比如 vue create myApp
  14. 选项与参数的区别:选项是命令内置实现,用户进行选择,参数一般是用户决定传入的值
  15. 选项一般会有全拼与简写形式(具体看使用的命令帮助),比如 --version = -v
  16. 全拼:以 开头 / 简写:以 - 开头
  17. 选项也可以接受值,值写在选项之后,通过空格分隔
  18. 多个简写的选项可以连写,开头使用一个 - 即可,需要注意的是,如果有接受值的选项需要放在最后,比如:
  19. vue create -d -r <-r的值> myApp
  20. vue create -dr <-r的值> myApp
  21. commander
  22. 命令行开发工具
  23. chalk
  24. 命令行样式风格控制器
  25. inquirer
  26. 交互式命令行工具
  27. .parse(argv: string[])
  28. 解析执行传入的 argv 命令字符串,通常改命令字符串来自用户在命令行的输入,process.argv
  29. commander 同时会默认创建一个 -h, --help 的选项
  30. .version(str, flags?)
  31. 设置版本信息,该方法会自动为命令注册一个 -V, --version option
  32. str:版本号
  33. flags:指定的 option,默认为:”-V, --version
  34. .option(flags, description?, fn?, defaultValue?)
  35. 设置命令选项
  36. flags:选项标记名称,”-v, --version
  37. description:选项使用说明
  38. fn:默认值,函数返回值为defaultValue,优先级高于defaultValue
  39. defaultValue:选项默认值,如果需要的话
  40. 选项属性
  41. flags 中的格式可以接收参数
  42. -n, --name [val]
  43. -n, --name
  44. [] 可选
  45. <> 必填
  46. 设置成功以后,会在命令对象下增加一个与全局的同名的属性
  47. .action(fn)
  48. 指定命令要执行的动作行为
  49. 该函数执行过程会接收到至少一个参数
  50. 如果命令中带有参数,则是对应的参数列表
  51. 参数的最后一个永远都是 commander 实例
  52. .command(name, desc?, opts?)
  53. name:命令的名称,也可以接受值
  54. create [appName]’
  55. desc:简介
  56. opts:配置
  57. .description(str)
  58. 命令描述
  59. .alias(str)
  60. 设置命令别名
  61. .usage(str)
  62. 设置或获取当前命令的使用说明

npm i commander

  1. const commander=require('commander')
  2. //设置当前的命令的版本
  3. // commander.version('1.0.1')
  4. //设置当前命令行可以改大小写
  5. commander.version('1.0.1','-v,--version')
  6. //[]表示可选 <>表示必填
  7. // commander.option('-n, --name <val>','打印名称','cccc')
  8. commander.option('-n, --name[val]','打印名称',function(val){
  9. console.log(val,'000000')
  10. return val
  11. })
  12. //设置命令的动作
  13. commander.action(()=>{
  14. //console.log(commander)
  15. console.log('hi '+commander.rawArgs.name)
  16. })
  17. //解析来自process.argv上的数据
  18. commander.parse(process.argv)
  19. // console.log(commander);

ls

  1. /**
  2. * ls 输出当前运行的目录文件
  3. * ls d:\
  4. * 我们可以指定目录
  5. *
  6. */
  7. //加载commander方法
  8. const commander=require('commander');
  9. const fs=require('fs')
  10. //设置当前命令工具的版本
  11. commander.version('v1.0.0','-v, --version')
  12. //子命令没有名字,
  13. // const subcommander=commander.command('<path>')
  14. // subcommander.option('-n, --name','设置名字')
  15. //实现命令具体逻辑
  16. commander.action((path)=>{
  17. //这里的path参数就是命令中定义的path
  18. console.log(path);
  19. //当前命令指定的目录下的文件以及文件夹全部显示在控制台上
  20. try{
  21. const files=fs.readdirSync(path)
  22. console.log(files);
  23. }catch(e){
  24. console.log(e);
  25. }
  26. })
  27. if(process.argv.length<3){
  28. process.argv.push(__dirname)
  29. }
  30. //解析argv
  31. commander.parse(process.argv)

实现-l命令

  1. /**
  2. * ls 输出当前运行的目录文件
  3. * ls d:\
  4. * 我们可以指定目录
  5. *
  6. */
  7. //加载commander方法
  8. const commander=require('commander');
  9. const fs=require('fs')
  10. //设置当前命令工具的版本
  11. commander.version('v1.0.0','-v, --version')
  12. commander.option('-p ,--path [path]','设置要显示的目录',__dirname)
  13. //如果选项不接收用户输入的参数值,那么这个选项将以boolean的形式提供给后面的形式使用
  14. commander.option('-l ,-list [path]','以列表的形式显示')
  15. //实现命令具体逻辑
  16. commander.action(()=>{
  17. //这里的path参数就是命令中定义的path
  18. //option中的变量会挂在当前commander对象的同名属性下
  19. try{
  20. const files=fs.readdirSync(commander.path)
  21. console.log(commander.List);
  22. if(commander.List){
  23. let output=files.map(file =>{
  24. let stat=fs.statSync(commander.path+'/'+file);
  25. //是否文件夹
  26. let type=stat.isDirectory()?'目录':'文件'
  27. return `[${type}] ${file} \r\n`
  28. }).join('');
  29. console.log(output);
  30. }else{
  31. console.log('00000000000000000000000000')
  32. console.log(files);
  33. }
  34. }catch(e){
  35. console.log(e);
  36. }
  37. //console.log(commander);
  38. })
  39. if(process.argv.length<3){
  40. process.argv.push(__dirname)
  41. }
  42. //解析argv
  43. commander.parse(process.argv)

chalk 处理颜色

  1. chalk
  2. chalk.<style>[.<style>...](string, [string...])
  3. Styles
  4. Modifiers 文字修饰:
  5. bold Colors 文字颜色:redgreenyellowbluecyan
  6. Background colors 背景颜色:bgRedbgGreenbgYellowbgBluebgCyan
  7. chalk
  8. Colors
  9. .hex('#DEADED')
  10. .keyword('orange')
  11. .rgb(15, 100, 204)
  12. Background colors
  13. .hex('#DEADED')
  14. .keyword('orange')
  15. .rgb(15, 100, 204)
  16. chalk
  17. 安装
  18. npm i chalk / yarn add chalk
  19. 使用
  20. const chalk = require('chalk')
  21. 得到一个 chalk 对象,通过这个对象,我们就可以给控制台中的文字加上各种样式了,就像css一样

Inquirer

交互式命令,提问用户,收集用户输入数据 安装

npm i inquirer

使用

require(‘inquirer’)

inquirer.prompt(questions).then(answers=>{

})

  1. const inquirer=require('inquirer')
  2. //提问用户,与用户进行命令行的交互
  3. // prompt数组中存在一个指定格式的对象
  4. /*
  5. Inquirer
  6. questions
  7. type:提问类型,input, confirm, list, rawlist, expand, checkbox, password, editor
  8. name:问题名称,供程序后续使用
  9. message:问题文字,给用户看的
  10. default:默认值
  11. choices:选项
  12. validate:输入验证
  13. filter:数据过滤
  14. */
  15. inquirer.prompt([
  16. {
  17. type:'input',
  18. name:'username',
  19. message:'请输入姓名',
  20. default:'wanzi',
  21. validate(val){
  22. if(val.trim()==''){
  23. return '应用名称不能为空'
  24. }else{
  25. return true
  26. }
  27. },
  28. //对用户输入的数据或选择的数据进行过滤
  29. filter(val){
  30. return val.toLowerCase()
  31. }
  32. },
  33. {
  34. type:'confirm',
  35. name:'xingbie',
  36. message:'是否同性恋',
  37. default:false
  38. },{
  39. type:'list',
  40. name:'gongzi',
  41. message:'你的工资范围',
  42. choices:[
  43. '100-1000',
  44. '1000-2000'
  45. ],
  46. default:1
  47. },{
  48. type:'rawlist',
  49. name:'gongzi2',
  50. message:'你的工资范围',
  51. choices:[
  52. '100-1000',
  53. '1000-2000'
  54. ],
  55. default:1
  56. },{
  57. type:'checkbox',
  58. name:'tools',
  59. message:'你感兴趣的话题',
  60. choices:[{
  61. name:'美妆',
  62. value:'meizhuang',
  63. checked:true
  64. },{
  65. name:'明星',
  66. value:'mingxing'
  67. },{
  68. name:'八卦',
  69. value:'bagua'
  70. }]
  71. }
  72. ]).then(answers=>{
  73. console.log(answers);
  74. })