Skip to content

脚手架核心流程开发

仲灏2023-02-06约 1 分钟

<div style="display: none;" hidden="true" aria-hidden="true" data-nosnippet>Are you an LLM? You can read better optimized documentation at /pages/a97403.md for this page in Markdown format</div>

image-20230207132755711

拆分原则

根据模块的功能拆分:

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

root-check

尝试降级具有root权限的进程的权限,如果失败则阻止访问

执行准备

创建功能模块文件夹, 并配置lerna packages

检查版本号

添加log lerna包

lerna create @zh-dev-cli/log utils 如果你像我这样包的路径修改了的话就需要注意在更路径的package.json文件中workspaces 添加utils

js
// utils/log/lib/index.js

const log = require('npmlog')
log.level = process.env.LOG_LEVEL ?? 'info'
log.heading = 'zh-dev-cli'
log.addLevel('success', 2000, {fg: 'green', bold: true})
module.exports = log;
js
// core/cli/lib/index.js

const pkg = require('../package.json')
const log = require('@zh-dev-cli/log')
function checkPkgVersion () {
    let version = pkg.version;
    log.notice('cli', version)
}

检查node 版本

semver

npm的语义版本器, 做各种各样的版本比对. 周下载量很高

colors

在node.js控制台中获取颜色和样式

Demo

js
// const.js

const LOWEST_NODE_VERSION = '12.0.0'

module.exports = {
    LOWEST_NODE_VERSION
}
js
// cli.js

const semver = require('semver')
const colors = require('colors/safe');
...
function checkNodeVersion() {
    const currentVersion = process.version
    const lowestVersion = constant.LOWEST_NODE_VERSION
    if(semver.lt(currentVersion, lowestVersion)) {
        throw new Error(colors.red(`zh-dev-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`))
    }
}

function core () {
    try {
        checkPkgVersion()
        checkNodeVersion()
    } catch (e) {
        log.error(e?.message)
    }
}

检查root启动

process.geteuid() 如果是0 , 说明是root账户, root账户所创建的文件是属于root账户的, 不变改写. 需要降级

root-check

尝试降级具有root权限的进程的权限,如果失败则阻止访问

img

lerna add root-check@1.0.0 core/cli 安装

js
function checkRoot() {
    const rootCheck = require('root-check')
    rootCheck()
}

检查用户主目录

user-home 废弃 使用os-homedir

返回当前用户的主目录。

path-exists

检查路径是否存在

安装: lerna add path-exists@4.0.0 core/cli 5.0.0版本需要使用到import导入, 与cjs不符

js
const pathExists = require('path-exists').sync;
...
function checkUserHome() {
    if(!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在'))
    }
}

检查入参

minimist

解析参数选项 这个模块是乐观主义者的论点解析器的核心,没有任何花哨的装饰。

js
// 示例
var argv = require('minimist')(process.argv.slice(2));
console.log(argv);

$ node example/parse.js -a beep -b boop
{ _: [], a: 'beep', b: 'boop' }
js
checkInputArgs()
const log = require('@zh-dev-cli/log')
...
function checkInputArgs() {
    const argv = require('minimist')(process.argv.slice(2));
    checkArgs(argv)
}

function checkArgs(args) {
    process.env.LOG_LEVEL = args.debug ? 'verbose' : 'info'
}
...

检查环境变量

dotenv

Dotenv是一个零依赖模块,它将环境变量从.env文件加载到process.env中。将配置与代码分开存储在环境中是基于the Twelve Factor App方法。

检查是否为最新版本

  • 拿到当前版本号和包名

  • 通过包名在线上通过ajax拿到所有的版本, 并对其倒序排序, 最后取第一个

  • 把最新版本号和当前版本号作对比