参考文档:https://www.jb51.net/article/159892.htm
1. 首先需要一个npm的账号,这里不建议用个人账号,注册一个团队账号
脚手架取名 much-cli
:寓意许多脚手架,希望前端和后端都能采用这个脚手架进行架构,实现单点维护,多点使用,同步升级等需求。
2. 创建一个目录 much-cli
在里面用npm进行初始化
npm init
如果不知道如何设定直接敲回车
这里需要点前置知识,写好脚手架会有一些必要的依赖需要了解
commander
这是用来编写指令和处理命令行的,具体用法参考如下
const program = require("commander"); // 定义指令 program .version('0.0.1') .command('init', 'Generate a new project from a template') .action(() => { // 回调函数 }) // 解析命令行参数 program.parse(process.argv);
inquirer
这是个强大的交互式命令行工具,具体用法参考如下
const inquirer = require('inquirer'); inquirer .prompt([ // 一些交互式的问题 ]) .then(answers => { // 回调函数,answers 就是用户输入的内容,是个对象 });
想象一下我们用
vue init webpack project-name
之后是不是会有几个交互问题,问你文件名啊、作者啊、描述啊、要不要用 eslint 啊等等之类的,就是用这个来写的。
chalk
这是用来修改控制台输出内容样式的,比如颜色啊,具体用法如下:
const chalk = require('chalk'); console.log(chalk.green('success')); console.log(chalk.red('error'));
ora
这是一个好看的加载,就是你下载的时候会有个转圈圈的那种效果,用法如下:
const ora = require('ora') let spinner = ora('downloading template ...') spinner.start()
download-git-repo
看名字很明显了,这是用来下载远程模板的,支持 GitHub、 GitLab 和 Bitbucket 等,用法如下:
const download = require('download-git-repo') download(repository, destination, options, callback)
其中
repository
是远程仓库地址;destination
是存放下载的文件路径,也可以直接写文件名,默认就是当前目录;options
是一些选项,比如{ clone:boolean }
表示用 http download 还是 git clone 的形式下载。
3. 安装依赖
有了以上知识之后就能先安装一些依赖
npm install commander inquirer chalk ora download-git-repo
会自动安装node依赖,并自动把版本写入package.json里面
4. 开始编写脚手架
新建一个 bin 文件夹,并在 bin 目录下新建一个无后缀名的 much 文件,并写上:
//much文件
#!/usr/bin/env node
console.log('hello much');
这个文件就是我们整个脚手架的入口文件,我们用 node ./bin/xr
运行一下,就能在控制台打印出 hello much
% node ./bin/much
hello much
4.1 bin文件夹初始化
目前文件夹内只有一个入口文件 much ,我们来编写它,让它实现简单的命令功能
#!/usr/bin/env node
// console.log('hello much')
const Program = require('commander');
const _package = require('../package.json')
// 定义名字
// 定义版本
// 定义用法
// 定义几个命令
Program
.name(_package.name)
.version(_package.version)
.usage('<command> [options]')
.command('add', '添加一个新模板')
.command('delete', '删除一个新模板')
.command('list', '列出所有模板')
.command('init', '从模板初始化一个新项目')
// 解析命令行参数
Program.parse(process.argv)
这个文件的作用就是用来定义指令,现在我们用 node ./bin/much
来看下效果
% node ./bin/much
Usage: much-cli <command> [options]
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
add 添加一个新模板
delete 删除一个新模板
list 列出所有模板
init 从模板初始化一个新项目
help [command] display help for command
当然如果觉得 node ./bin/much
这个命令太麻烦的话,可以在package.json中添加以下内容
// bin 用来指定每个命令所对应的可执行文件的位置
"bin": {
"much-cli": "/bin/much"
}