脚手架核心开发流程

脚手架架构图

gitFlow

gitFlow

脚手架拆分策略

拆分原则

根据模块的功能来拆分:

  • core: 核心模块
  • 命令模块:commands
  • 模型模块:models
  • 工具模块:utils

拆分结果为以下

  • 核心流程:core

  • 命令:commands

    • 初始化
    • 发布
    • 清除缓存
  • 模型层:models

    • Command 命令
    • Project 项目
    • Component 项目
    • Npm 模块
    • Git 仓库
  • 支撑模块:utils

    • Git 操作
    • 云构建
    • 工具方法
    • API请求
    • Git Api

命令执行流程

检测版本号

直接输出当前 package.json 信息

function checkPkgVersion() {
    log.info('cli', pkg.version)
}

检查 Node 版本

获取系统的 Node版本,然后和我们预定的版本进行对比

function checkNodeVersion() {
    // 获取当前Node版本
    const currentVersion = process.version;
    const lowestVersion = constant.LOWEST_NODE_VERSION;
    // 比对最低版本号
    if (!semver.gte(currentVersion, lowestVersion)) {
        throw new Error(colors.red(`aotu-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`))
    }
}

检查是否 root 启动

利用 root-check 来帮忙我们快速实现,如果是 root 启动,会帮我们进行降级

function checkRoot() {
    // root 启动的目录无法操作,需要进行降级
    // sudo 启动 打印就是 0  正常就是 501
    const rootCheck = require('root-check')
    rootCheck()
}

检测用户主目录

const userHome = require('user-home')
const pathExists = require('path-exists').sync
function checkUserHome() {
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前用户主目录不存在,请检查!'))
    }
}

检测入参

根据输入参数是否开启 debug 模式

function checkInputArgs() {
    args = require('minimist')(process.argv.slice(2))
    checkArgs()
}

function checkArgs() {
    if (args.debug) {
        process.env.LOG_LEVEL = 'verbose'
    } else {
        process.env.LOG_LEVEL = 'info'
    }
    log.level = process.env.LOG_LEVEL;
}

检查环境变量

function checkEnv() {
    const dotenv = require('dotenv');
    const dotenvPath = path.resolve(userHome, '.env')
    if (pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        })
    }
    createDefaultConfig()
    log.verbose('环境变量', process.env.CLI_HOME_PATH)
}

function createDefaultConfig() {
    const cliConfig = {
        home: userHome
    };
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

检测是否最新版本

async function checkGlobalUpdate() {
    // 获取最新版本号和模块名
    const currentVersion = pkg.version;
    const npmName = pkg.name;
    // 调用 API 拿到所有版本号
    const { getNpmSemverVersion } = require('get-npm-info');
    // 提取所有版本号,对比那些版本号大于当前版本号
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName);
    // 获取最新版本号,提示用户更新到该版本
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn(colors.yellow(`请手动更新 ${npmName},当前版本:${lastVersion},最新版本 ${lastVersion}
                  更新命令:npm install -g ${npmName}`))
    }
}

Node 支持 Es Module

可以采用 Gulp 进行编译,可以参考 使用 Gulp 对 Node 进行编译

Copyright © imooc-lego (2020 - present) all right reserved,powered by GitbookFile Modify: 2021-06-27 08:04:57

results matching ""

    No results matching ""