学习笔记──搭建脚手架(一)──系统创建

undefined

前言

通过借鉴同事的一个脚手架一步步实现如何去做一个脚手架。

  • Node.js:整个脚手架的运行环境。
  • es6:JavaScript的新语法。
  • commander:TJ大神开发的工具,可以自动的解析命令和参数,用于处理用户输入的命令。
  • download-git-repo,下载并提取 git 仓库,用于下载项目模板。
  • Inquirer.js,通用的命令行用户界面集合,用于和用户进行交互。
  • chalk:色彩丰富的终端工具,可以给终端的字体加上颜色。
  • ora:典雅的终端微调器,控制终端输出,下载过程久的话,可以用于显示下载中的动画效果。

1、新建一个目录

新建一个目录 ls-cli并进入 cd ls-cli 。然后 npm init 初始化一下生成package.json文件,在文件中设置bin,可以全局使用。

"bin": {
    "ls-cli": "cli/bin/ls-cli.js"
},

在文件中写入依赖并执行 npm install,这里有第一阶段在是还没用到的。

"dependencies": {
    "chalk": "^2.4.2",
    "commander": "^2.20.0",
    "download-git-repo": "^2.0.0",
    "inquirer": "^6.5.1",
    "ora": "^2.1.0",
    "shelljs": "^0.8.3",
    "events": "^3.0.0",
    "execa": "^0.10.0",
    "fs-extra": "^7.0.0",
    "readline": "^1.3.0",
    "replace-in-file": "^3.4.4",
    "string.prototype.padstart": "^3.0.0",
    "validate-npm-package-name": "^3.0.0"
}

2、编写入口文件

我在根目录下建立 \cli\bin 文件夹,在里面建立一个 ls-cli.js 文件。这个 cli\bin/ls-cli.js 文件是整个脚手架的入口文件。

#!/usr/bin/env node
const program = require('commander')
const pkg = require('../../package.json')

program
  .version(pkg.version, '-v, --version')
  .usage('<command> [options]')
  .description('ls-cli脚手架工具简介,提供**功能,包括初始化工程、新增组件、模板列表、删除等常用命令')

program
  .command('create <projectName>')
  .description('create a new project')
  .option('-c, --create', 'create description')
  .action((name, cmd) => {
    console.log('create ' + name  + ' ' + (cmd.create ? cmd.create : '')) 
    // lsqu-cli create b -r --> 输出:create b  true
  })

program
  .command('add <componentName>')
  .description('添加一个新组件')
  .alias('a')
  .action((name, cmd) => {
    console.log('add ' + name)
  })

program
  .command('list')
  .description('展示模板列表')
  .alias('l')
  .action(() => {
    require('../command/list')()
  })

program.on('--help', function(){
  console.log('')
  console.log('Examples:');
  console.log('  $ custom-help --help');
  console.log('  $ custom-help -h');
})

program.parse(process.argv)

commander模块解析

【1】版本命令 .version(‘0.0.1’, ‘-V, –version’)
语法:.version(‘版本号-必须’, ‘自定义标志-可省略:默认为 -V, –version’)
【2】. 自定义添加命令名 .command()
语法:.command(‘rmfile <file> [otherFiles…]’, ‘description’, opts)
解析:.command(‘命令名称 <必填参数> [其他参数列表…]’, ‘命令描述’, 配置选项)
【注】:
  1. 命令名称<必须>:命令后面可跟用 <> 或 [] 包含的参数;命令的最后一个参数可以是可变的,像实例中那样在数组后面加入 … 标志;在命令后面传入的参数会被传入到 action 的回调函数以及 program.args 数组中。
  2. 命令描述<可省略>:如果存在,且没有显示调用action(fn),就会启动子命令程序,否则会报错
  3. 配置选项<可省略>:可配置noHelp、isDefault等
【3】 .description(str) : 定义选项和模块描述
语法:.description(‘desc’)
【4】.option(flag,description) 用于定义命令选项
语法:.option(‘-n, –name<path>’, ‘name description’)
【参数解析】:
  1. 自定义标志<必须>:分为长短标识,中间用逗号、竖线或者空格分割;标志后面可跟<必须参数>或[可选参数]
  2. 选项描述<省略不报错>:在使用 –help 命令时显示标志描述
  3. 【options在命令上绑定选项】——使执行命令时,将验证该命令的options,任何未知的option都将报错。 但是,如果基于action的命令如果没有定义action,则不验证options。
【5】.action(fn) : 匹配相应选项执行函数,接受选项名name和参数列表args;表示必须有该选项,[name…]表示可选选项
语法:.action(fn)
【6】.alias(name) : 定义别名;用于选项;参数定义无效;
【7】.otps(): 返回options的键值对表示的对象
【8】.parse 用于解析process.argv,设置options以及触发commands
语法:.parse(process.argv)
【9】help命令
  1. 默认help Automated –help 帮助信息是根据commander已知的信息自动生成的
  2. 自定义help Custom help;可以通过侦听“–help”来显示任意-h, – help信息。 一旦完成,Commander将自动退出,所以程序on后的其余部分将不会执行。
今天就到这里了,下一篇文章更新命令内部逻辑的编写。
本文仅是学习中的记录,有错误请指正。
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容