相信你一定用过vue-cli或者create-react-app或者你公司自己的脚手架。当我第一次用这些脚手架的时候,会觉得这一定是种很高级的玩意,其实了解过之后就发现,脚手架也并不是多么深奥的东西。怎么做一个脚手架呢?接下来我会一步步的教你如何完成一个自己的脚手架(源码:https://github.com/hui-fly/rv-cli,记得star哦)
1. 预备知识
本次教大家实现一个基础的cli工具,将会用到以下一些依赖,下面对这些依赖进行简单介绍:
Inquirer.js
Inquirer.js试图为NodeJs做一个可嵌入式的美观的命令行界面。它的功能主要是:
- 询问操作者问题
- 获取并解析用户输入
- 检测用户回答是否合法
- 管理多层级的提示
- 提供错误回调
用法示例:
建立index.js,内容如下
let inquirer = require('inquirer')
inquirer.prompt([
{
type: 'confirm',
name: 'handsome',
message: '我是世界上最帅的男人吗?',
default: true
}
]).then((answers) => {
console.log(answers)
})
在文件目录线执行node index.js得到结果如下:
{ handsome:true }
这里type的类型包括
- input–输入
- validate–验证
- list–列表选项
- confirm–提示
- checkbox–复选框等等
想了解更多请参考:https://juejin.im/entry/5937c73cac502e0068cf1171
commander
官方解释:commander灵感来自 Ruby,它提供了用户命令行输入和参数解析的强大功能,可以帮助我们简化命令行开发,它提供的功能是:
- 参数解析
- 强制多态
- 可变参数
- Git 风格的子命令
- 自动化帮助信息
- 自定义帮助等
这么说想必大家也比较抽象,直接上例子:
const program = require("commander");
// 定义指令
program
.version('0.0.1')
.usage('<command> [options]')
.command('init', 'Generate a new project from a template')
.action((option) => {
// 回调函数
console.log('Hello World')
})
// 解析命令行参数
program.parse(process.argv);
同样在文件目录下执行node command.js init
然后就会发现输出 Hello World
如果你想了解更多,可以参考https://wangchujiang.com/wcj/#Commander
download-git-repo
这个看名字大概就能猜出它是干嘛的了,没错—它就是帮我们完成下载远程仓库的,它的用法也比较简单,示例如下:
const download = require('download-git-repo')
download(repository, destination, options, callback)
其中 repository 是远程仓库地址;destination是存放项目的文件夹,下载完之后会默认建立在本目录下;options 是一些选项,比如 { clone:boolean }
表示用 http download 还是 git clone 的形式下载,callback就是下载完成之后的回调函数了。
chalk
这个依赖可以让你输出的内容变得更好看
const chalk = require('chalk');
console.log(chalk.green('success'));
console.log(chalk.red('error'));
ora
这个依赖可以产生一个loading的效果,在进行下载的时候我们会用到它
OK,以上就是我们这次会用到的所有依赖了,接下里开始搞起我们的脚手架吧!
2. 脚手架开发
项目文件结构搭建
- 首先初始化我们的项目,建立一个文件夹,我这里就叫rv-cli,你也可以随意取.
- 建立好之后,在文件夹下执行npm init(相信你一定已经安装了node了),一路回车即可,然后就会帮你生成一个package.json文件,在package.json添加如下代码–即我们预备知识介绍的依赖
"dependencies": {
"chalk": "^2.4.2",
"commander": "^2.19.0",
"download-git-repo": "^1.1.0",
"inquirer": "^