实现自定义脚手架
1.项目结构初始化
1.1项目结构目录
mycli
bin
cli.js
在终端中打开mycli文件夹 执行 npm init
;
初始化完成后执行 npm link
;
2.创建自定义全局指令
bin/cli.js
#! /usr/bin/env node
2.1指令处理工具 npm i commander
bin/cli.js
#! /usr/bin/env node
import { program } from "commander";
program.option('-h --help <help>','帮助');
program.command('create <project> [others...]')
.description("创建项目")
.alias("crt")
.action((project,args) =>{
console.log(project,args);
})
2.2 安装终端交互工具
npm i inquirer
bin/cli.js
#! /usr/bin/env node
import { program } from "commander";
import inquirer from "inquirer";
program.option('-h --help <help>','帮助');
program.command('create <project> [others...]')
.description("创建项目")
.alias("crt")
.action((project,args) =>{
inquirer.prompt([{
type: 'list',
name:'frame';
message:'请为项目选择框架',
choices: ['express','egg','koa']
}]).then((answer)=>{
console.log(answer);
})
})
2.3 安装远程下载代码工具
npm i download-git-repo
bin/cli.js
#! /usr/bin/env node
import { program } from "commander";
import inquirer from "inquirer";
import download from "download-git-repo";
program.option('-h --help <help>','帮助');
program.command('create <project> [others...]')
.description("创建项目")
.alias("crt")
.action((project,args) =>{
inquirer.prompt([{
type: 'list',
name:'frame';
message:'请为项目选择框架',
choices: ['express','egg','koa']
}]).then((answer)=>{
console.log(answer);
//实际使用时请将url替换成远程代码仓库地址
download('direct:'+url,'projectName',{clone:true},(err)=>{
if(!err){
console.log("项目创建成功")
}
})
})
})
2.4 优化代码下载状态以及终端窗口提示信息
npm i ora
代码下载状态优化工具
npm i chalk
终端窗口提示信息优化工具
bin/cli.js
#! /usr/bin/env node
import { program } from "commander";
import inquirer from "inquirer";
import download from "download-git-repo";
import ora from "ora";
import chalk from "chalk";
program.option('-h --help <help>','帮助');
program.command('create <project> [others...]')
.description("创建项目")
.alias("crt")
.action((project,args) =>{
inquirer.prompt([{
type: 'list',
name:'frame';
message:'请为项目选择框架',
choices: ['express','egg','koa']
}]).then((answer)=>{
console.log(answer);
const spinner = ora().start();
spinner.text="项目代码下载中···"
//实际使用时请将url替换成远程代码仓库地址
download('direct:'+url,'projectName',{clone:true},(err)=>{
if (!err) {
spinner.succeed(chalk.yellow.bold("Success!!!"));
console.log(
chalk.rgb(13, 188, 120).bold("Done "),
chalk.bold("you can:")
);
console.log("cd " + project);
console.log("nmp i");
console.log("npm run dev");
console.log("to start you project");
} else {
spinner.fail(chalk.ref("Failed"));
}
})
})
})