编写脚手架

36 阅读1分钟

编写脚手架

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('下载成功')
            }
        })
    })
}