编写脚手架
1.自定义的命令 而不是node去执行脚本 2.-V --help create 命令行交互工具 3.去下载模板isTs 下载ts版本 不要就下载js
自定义的命令 而不是node去执行脚本
"bin": {
"tec-cli": "src/index.js"
}
npm link //创建一个软连接挂载全局
执行命令tsc-cli create xiaoman
index.js
// #!/usr/bin/env node
// 告诉操作系统执行自定义命令的时候 你帮我用node去执行这个文件
// npm i commander inquirer ora download-git-repo
import { program } from 'commander';
import inquirer from 'inquirer';
import fs from "node:fs"
import { checkPath, downloadTemp } from './utils.js'
let json = fs.readFileSync('./package.json')
json = JSON.parse(json)
program.version(json.version)
program.command('create <projectName>').alias('c').description('创建项目').action((projectName) => {
inquirer.prompt([{
type: 'input',
name: 'projectName',
message: '请输入项目名称',
default: projectName
}, {
type: 'confirm',
name: 'isTs',
message: '是否使用typescript',
default: false
}])
.then(res => {
if (checkPath(res.projectName)) {
console.log('项目已存在')
return
}
if (res.isTs) {
downloadTemp('ts', res.projectName)
} else {
downloadTemp('js', res.projectName)
}
})
})
program.parse(process.argv)
utils.js
import fs from 'node:fs';
import download from 'download-git-repo';
import ora from 'ora';
const spinner = ora('downloading template...');
export const checkPath = (path) => {
// if (fs.existsSync(path)) {
// return true;
// } else {
// return false;
// }
return fs.existsSync(path)
}
export const downloadTemp = (branch, name) => {
spinner.start();
return new Promise((resolve, reject) => {
download(`direct:https://gitee.com/chinafaker/vue-tempalte.git#${branch}`, name, { clone: true }, function (err) {
if (err) {
reject(err)
} else {
resolve()
spinner.succeed('下载成功')
}
})
})
}