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