參考文檔:https://www.jb51.net/article/159892.htm
1. 首先需要一個npm的賬號,這里不建議用個人賬號冗澈,注冊一個團(tuán)隊賬號
腳手架取名 much-cli
:寓意許多腳手架群叶,希望前端和后端都能采用這個腳手架進(jìn)行架構(gòu)钻趋,實現(xiàn)單點維護(hù)邻寿,多點使用,同步升級等需求绽快。
2. 創(chuàng)建一個目錄 much-cli
在里面用npm進(jìn)行初始化
npm init
如果不知道如何設(shè)定直接敲回車
這里需要點前置知識碱屁,寫好腳手架會有一些必要的依賴需要了解
commander
這是用來編寫指令和處理命令行的,具體用法參考如下
const program = require("commander"); // 定義指令 program .version('0.0.1') .command('init', 'Generate a new project from a template') .action(() => { // 回調(diào)函數(shù) }) // 解析命令行參數(shù) program.parse(process.argv);
inquirer
這是個強(qiáng)大的交互式命令行工具客年,具體用法參考如下
const inquirer = require('inquirer'); inquirer .prompt([ // 一些交互式的問題 ]) .then(answers => { // 回調(diào)函數(shù)霞幅,answers 就是用戶輸入的內(nèi)容,是個對象 });
想象一下我們用
vue init webpack project-name
之后是不是會有幾個交互問題量瓜,問你文件名啊司恳、作者啊、描述啊绍傲、要不要用 eslint 啊等等之類的扔傅,就是用這個來寫的。
chalk
這是用來修改控制臺輸出內(nèi)容樣式的烫饼,比如顏色啊铅鲤,具體用法如下:
const chalk = require('chalk'); console.log(chalk.green('success')); console.log(chalk.red('error'));
ora
這是一個好看的加載,就是你下載的時候會有個轉(zhuǎn)圈圈的那種效果枫弟,用法如下:
const ora = require('ora') let spinner = ora('downloading template ...') spinner.start()
download-git-repo
看名字很明顯了邢享,這是用來下載遠(yuǎn)程模板的,支持 GitHub淡诗、 GitLab 和 Bitbucket 等骇塘,用法如下:
const download = require('download-git-repo') download(repository, destination, options, callback)
其中
repository
是遠(yuǎn)程倉庫地址;destination
是存放下載的文件路徑韩容,也可以直接寫文件名款违,默認(rèn)就是當(dāng)前目錄;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文件夾初始化
目前文件夾內(nèi)只有一個入口文件 much 气嫁,我們來編寫它,讓它實現(xiàn)簡單的命令功能
#!/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', '從模板初始化一個新項目')
// 解析命令行參數(shù)
Program.parse(process.argv)
這個文件的作用就是用來定義指令够坐,現(xiàn)在我們用 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
當(dāng)然如果覺得 node ./bin/much
這個命令太麻煩的話寸宵,可以在package.json中添加以下內(nèi)容
// bin 用來指定每個命令所對應(yīng)的可執(zhí)行文件的位置
"bin": {
"much-cli": "/bin/much"
}