logo
0
0
WeChat Login
feat(core): 实现智能项目配置生成工具

XCLI

XCLI 是一个智能项目配置生成工具,能够自动识别项目类型并生成相应的开发配置文件。

功能特性

  • 自动项目类型探测:支持 Go、Vue、React 等多种项目类型
  • 一键配置生成:根据项目类型自动生成常用的配置文件
  • 约定优于配置:模板采用自动发现机制,无需手动注册
  • 安全覆盖策略:文件已存在时自动跳过,避免覆盖现有配置

支持的项目类型

项目类型识别依据生成的配置文件
Go存在 go.modMakefile
Vuepackage.json 中包含 "vue".eslintrc.js, prettier.config.js
Reactpackage.json 中包含 "react".eslintrc.js, prettier.config.js

安装

go build -o xcli main.go

使用方法

在项目根目录下执行:

./xcli

工具会自动检测项目类型并生成相应的配置文件。

项目结构

. ├── main.go # 程序入口 ├── go.mod # Go 模块定义 ├── pkg/ │ ├── detector/ │ │ └── detector.go # 项目类型探测器 │ ├── generator/ │ │ ├── generator.go # 生成器接口定义 │ │ ├── factory.go # 工厂模式:生成器创建 │ │ ├── templates.go # 模板处理逻辑 │ │ ├── go_generator.go # Go 项目生成器 │ │ ├── vue_generator.go # Vue 项目生成器 │ │ ├── react_generator.go # React 项目生成器 │ │ └── templates/ # 模板文件目录 │ │ ├── go/ │ │ │ └── Makefile.tmpl │ │ ├── vue/ │ │ │ ├── eslintrc.js.tmpl │ │ │ └── prettier.config.js.tmpl │ │ └── react/ │ │ ├── eslintrc.js.tmpl │ │ └── prettier.config.js.tmpl │ └── utils/ │ └── file_utils.go # 文件工具函数 └── README.md

架构设计

策略模式 + 工厂模式

项目采用策略模式定义生成器接口,通过工厂模式根据项目类型创建对应的生成器实例:

┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ Detector │────▶│ Factory │────▶│ Generator │ │ (探测类型) │ │ (创建生成器) │ │ (执行生成逻辑) │ └─────────────┘ └─────────────┘ └─────────────────┘ │ ▼ ┌─────────────┐ │ Templates │ │ (嵌入的模板) │ └─────────────┘

模板自动发现机制

模板文件存放在 pkg/generator/templates/ 目录下,按项目类型分子目录存放:

  • 模板文件使用 .tmpl 后缀
  • 通过 //go:embed 指令嵌入到可执行文件中
  • 运行时自动遍历目录,移除 .tmpl 后缀后生成目标文件

开发指南

添加新的项目类型支持

  1. pkg/detector/detector.go 中添加新的项目类型常量
  2. Detect() 函数中添加识别逻辑
  3. pkg/generator/ 下创建对应的生成器(如 xxx_generator.go
  4. pkg/generator/factory.go 中注册生成器
  5. pkg/generator/templates/ 下创建模板目录和模板文件

示例:添加 Node.js 项目支持

detector.go:

const ( // ... TypeNode ProjectType = "NODE" ) func Detect() ProjectType { // ... if utils.FileExists("package.json") { return TypeNode } }

node_generator.go:

type NodeGenerator struct{} func (n *NodeGenerator) Generate() error { fmt.Println("🚀 正在为 Node.js 项目生成常用配置...") return GenerateFromDir("node") }

factory.go:

case detector.TypeNode: return &NodeGenerator{}

许可证

MIT