# Vite插件开发需求文档:Turborepo工作区编译部署自动化工具 ## 一、项目概述 **项目名称**:vite-plugin-turborepo-deploy **目标**:开发一个Vite插件,实现Turborepo工作区编译后的自动化部署流程,涵盖本地文件同步、Git项目管理(包含可选的智能化自动提交功能,并支持提交信息在项目间共享)。 ## 二、功能需求 ### 1. 本地文件同步功能 - **配置方式**:支持在插件配置中定义多个本地文件/目录同步任务 - **同步模式**: - `copy`:简单复制,不处理目标目录已存在文件 - `mirror`:镜像同步,删除目标目录中不存在于源的文件 - `incremental`:增量更新,仅覆盖已变更文件 - **清空目标目录**:支持通过`clearTarget`字段在同步前清空目标目录 - **全新添加模式**:支持`addOnly`字段,仅新增源中存在而目标中不存在的文件/目录 - **过滤规则**: - `exclude`:支持通过正则表达式排除特定文件/目录 - `excludeDirs`:指定排除的目录(支持glob或正则) - `excludeFiles`:指定排除的文件(支持glob或正则) - **路径解析**:所有相对路径自动基于项目根目录解析 ### 2. Git项目管理与自动提交功能 - **多项目支持**:可配置多个Git项目的拉取/更新任务。 - **分支管理**:支持指定拉取分支,自动切换到目标分支。 - **目录管理**: - 支持自定义项目存放目录。 - 支持重命名项目目录(通过`projectName`字段)。 - **自动操作**: - 检测项目是否存在:存在则执行`git pull`更新,不存在则执行`git clone`。 - 拉取前自动切换到指定分支。 - 支持私有仓库(通过SSH密钥或HTTPS认证)。 - **可选的自动提交 (Per-Project Auto Commit)**: - **启用方式**:在每个Git项目配置中,通过`autoCommit`对象启用和配置。 - **智能提交检测机制**(用于填充共享缓冲区或单个项目扫描): - **开发者监听**:通过配置指定需要监听的开发者用户名(对应Git配置中的`user.name`)。 - **提交记录扫描**: - 默认扫描最近50条提交记录(可通过配置调整)。 - 按时间倒序扫描,优先获取最新提交。 - **提交分隔符**:使用特殊标记(默认`/** 提交分隔符 **/`)识别分段点。 - **双模式处理**: - **模式1**:存在分隔符时,获取分隔符之后的所有提交。 - **模式2**:不存在分隔符时,获取最近一条指定开发者的提交。 - **共享提交信息机制 (Shared Commit Buffer)**: - **目的**:当多个Git项目基于同一组源变更(如主仓库的特定开发者提交)进行自动提交时,允许一次获取提交信息并复用。 - **信息来源**:在`gitProjects`任务执行期间,第一个成功通过"智能提交检测机制"获取到提交信息的项目,其结果将被缓存为"共享提交信息"。 - **信息使用**:后续的Git项目若在其`autoCommit`配置中设置了`useSharedCommits: true`,则会尝试使用此共享信息。若共享信息为空,或项目未配置使用,则回退到独立扫描其自身仓库。 - **生命周期**:共享提交信息在每次`updateGitProjects`任务开始时清空。 - **提交信息生成**: - 若项目配置为使用共享提交信息且缓冲区存在内容,则直接使用。 - 否则,使用从当前项目独立扫描获取的提交信息。 - 合并多条提交时,采用特定格式: ```markdown [自动合并] 包含N次提交: 1. [commitHash1] commitMessage1 2. [commitHash2] commitMessage2 ... /** 提交分隔符 **/ ``` - **提交后操作**:无论是否使用共享信息,自动提交成功后,都在当前Git项目的**当前分支**插入一条新的、空的提交分隔符记录。 - **错误处理**(针对单个项目的自动提交过程): - **无匹配提交**:若独立扫描未找到指定开发者的任何提交,在该项目中抛出警告但继续执行后续任务。 - **重复分隔符**:若检测到连续两条分隔符提交,自动清理冗余记录。 - **提交冲突**:在提交前检查工作区状态,存在未提交变更时抛出错误并跳过该项目的自动提交。 - **推送**:支持配置是否在自动提交后推送到远程仓库的对应分支。 ### 3. 任务编排系统 - **顺序执行**:支持按数组顺序依次执行配置的任务。 - **内置任务**: - `localSync`:执行本地文件同步。 - `updateGitProjects`:更新所有Git项目(如果项目配置了自动提交,则在此阶段执行,包括处理共享提交信息逻辑)。 - **扩展机制**:支持自定义任务(通过插件钩子)。 ### 4. 日志记录系统 - **日志文件**: - 自动在项目根目录下创建`.sync-log`目录。 - 按日期生成日志文件(如`2023-05-15_deploy.log`)。 - **日志级别**: - `error`:仅记录错误信息。 - `info`:记录关键步骤信息。 - `verbose`:记录详细执行过程(默认)。 - **控制台输出**: - 彩色日志显示。 - 关键步骤进度提示。 ## 三、技术实现要求 ### 1. 基础架构 - **开发语言**:TypeScript,所有源码必须为`.ts`或`.tsx`文件,禁止使用`any`类型。 - **Node.js 版本**:要求 Node.js 16 及以上,推荐 LTS 版本,需兼容 ESM。 - **Vite 版本**:兼容 Vite 3.x 及以上,插件需遵循 Vite 官方插件开发规范。 - **插件类型**:构建后插件(在`buildEnd`钩子触发),需支持异步任务。 - **依赖管理**:使用 pnpm/yarn/npm,推荐 pnpm,所有依赖需锁定版本。 ### 2. 代码规范与最佳实践 - **类型安全**:全量使用 TypeScript 接口,避免类型推断不明确。 - **函数式编程**:优先使用函数式、声明式风格,避免类和全局变量。 - **模块化**:每个功能模块单独文件,导出命名函数,禁止默认导出。 - **注释规范**:所有导出函数、接口、类型需使用 JSDoc 注释,描述参数、返回值和用途。 - **错误处理**:所有异步操作需捕获异常,关键错误需中断流程并输出详细日志。 - **日志系统**:日志输出需支持彩色(chalk),并写入`.sync-log`目录下的日志文件,日志内容需结构化,便于后续分析。 ### 3. 性能与兼容性 - **异步并发**:文件同步、Git 操作等 IO 密集型任务需支持并发,合理控制并发数,避免资源争用。 - **跨平台**:需兼容 Windows、Linux、macOS,路径处理需使用 Node.js path 模块。 - **配置热重载**:插件配置变更后,支持自动重载,无需重启 Vite 服务。 - **资源优化**:插件自身体积需控制在合理范围,避免引入过大依赖。 ### 4. 插件接口与类型定义 - **类型导出**:所有配置接口需导出,便于用户类型推断和 IDE 智能提示。 - **配置校验**:插件初始化时需校验用户配置,发现错误需抛出详细异常。 - **Vite 插件约定**:导出标准 Vite 插件对象,支持链式调用和多插件组合。 ### 5. 依赖与工具 - `fs-extra`:文件操作 - `simple-git`:Git 命令封装 - `chalk`:控制台彩色输出 - `ora`:进度指示器 - `zod` 或 `joi`:配置校验(推荐 zod) ### 6. 测试与质量保障 - **单元测试**:使用 Vitest 或 Jest,覆盖率需达 80% 以上。 - **集成测试**:模拟完整部署流程,验证各功能模块协作。 - **CI/CD**:集成 GitHub Actions,自动化测试、构建和发布。 ## 四、交互与输出 ### 1. 控制台输出示例 ``` 🚀 [Turborepo Deploy] 开始执行部署流程... 🔄 正在同步本地文件... ✅ 已同步 dist → ../deploy/public (mirror模式) ✅ 已同步 src/assets → ../deploy/assets (incremental模式) 🔄 正在更新Git项目... ⏳ 正在处理 api-gateway (分支: develop)... ✅ 已更新至最新版本 (commit: abc123) ✨ 开始执行 api-gateway 的自动提交 (作为共享信息源)... ✅ 已扫描最近50条提交记录, 找到提交分隔符(位于 commit: abc123) ✅ 识别到3条待同步提交, 已存入共享缓冲区。 - [def456] 修复登录验证问题 - [ghi789] 优化API响应格式 - [jkl012] 添加用户头像上传功能 ✅ 已合并提交 (commit: mno345) 并推送到远程 (develop) ✅ 已在 api-gateway (develop) 插入新的提交分隔符 (commit: pqr678) ⏳ 正在处理 user-service (分支: feature/new-endpoint)... ✅ 已更新至最新版本 (commit: stu789) ✨ 开始执行 user-service 的自动提交 (使用共享信息)... ✅ 使用了来自 api-gateway 的3条共享提交信息。 ✅ 已合并提交 (commit: vwx123) 并推送到远程 (feature/new-endpoint) ✅ 已在 user-service (feature/new-endpoint) 插入新的提交分隔符 (commit: yz034) ⏳ 正在处理 another-service (分支: main)... ✅ 已更新至最新版本 (commit: bcd234) ✨ 开始执行 another-service 的自动提交 (独立扫描)... ✅ 未找到指定开发者或分隔符的提交,未执行自动提交。 ✅ [Turborepo Deploy] 部署完成! ``` ### 2. 日志文件格式 ``` [2023-05-15T14:30:21.123Z] [INFO] 开始执行部署流程... [2023-05-15T14:30:21.456Z] [INFO] 正在同步本地文件... [2023-05-15T14:30:23.789Z] [INFO] 已同步 dist → ../deploy/public (mirror模式) [2023-05-15T14:30:25.012Z] [INFO] 已同步 src/assets → ../deploy/assets (incremental模式) [2023-05-15T14:30:25.345Z] [INFO] 正在更新Git项目... [2023-05-15T14:30:25.678Z] [INFO] [api-gateway] 正在处理项目 (分支: develop)... [2023-05-15T14:30:30.234Z] [INFO] [api-gateway] 已更新至最新版本 (commit: abc123) [2023-05-15T14:30:30.500Z] [INFO] [api-gateway] 开始执行自动提交 (作为共享信息源)... [2023-05-15T14:30:31.890Z] [INFO] [api-gateway] 已扫描最近50条提交记录, 找到提交分隔符(位于 commit: abc123) [2023-05-15T14:30:32.123Z] [INFO] [api-gateway] 识别到3条待同步提交, 已存入共享缓冲区。 [2023-05-15T14:30:32.456Z] [INFO] [api-gateway] - [def456] 修复登录验证问题 [2023-05-15T14:30:32.789Z] [INFO] [api-gateway] - [ghi789] 优化API响应格式 [2023-05-15T14:30:33.012Z] [INFO] [api-gateway] - [jkl012] 添加用户头像上传功能 [2023-05-15T14:30:35.678Z] [INFO] [api-gateway] 已合并提交 (commit: mno345) 并推送到远程 (develop) [2023-05-15T14:30:36.901Z] [INFO] [api-gateway] 已插入新的提交分隔符 (commit: pqr678) [2023-05-15T14:30:37.100Z] [INFO] [user-service] 正在处理项目 (分支: feature/new-endpoint)... [2023-05-15T14:30:40.234Z] [INFO] [user-service] 已更新至最新版本 (commit: stu789) [2023-05-15T14:30:40.500Z] [INFO] [user-service] 开始执行自动提交 (使用共享信息)... [2023-05-15T14:30:40.501Z] [INFO] [user-service] 使用了来自 api-gateway 的3条共享提交信息。 [2023-05-15T14:30:43.678Z] [INFO] [user-service] 已合并提交 (commit: vwx123) 并推送到远程 (feature/new-endpoint) [2023-05-15T14:30:44.901Z] [INFO] [user-service] 已插入新的提交分隔符 (commit: yz034) [2023-05-15T14:30:45.000Z] [INFO] [another-service] 正在处理项目 (分支: main)... [2023-05-15T14:30:50.000Z] [INFO] 部署完成! ``` ## 五、使用示例 ```typescript // vite.config.ts import { defineConfig } from 'vite'; import turborepoDeploy from 'vite-plugin-turborepo-deploy'; export default defineConfig({ plugins: [ turborepoDeploy({ localSync: [ { source: 'dist', target: '../deploy/public', mode: 'mirror', clearTarget: true }, { source: 'src/assets', target: '../deploy/assets', excludeDirs: ['**/tmp'], excludeFiles: ['**/*.psd'] } ], gitProjects: [ { repo: 'git@github.com:example-org/api-gateway.git', branch: 'develop', targetDir: 'services/api-gateway', projectName: 'api-gateway', // 用于日志中清晰标识源 autoCommit: { // 此项目将作为共享提交信息的来源 enabled: true, watchAuthor: '张三', maxScanCount: 100, commitSeparator: '/** AUTO MERGE MARK **/', message: 'chore(api-gateway): auto merge [skip ci]', push: true // useSharedCommits: false, // 或不设置,默认为false,它会尝试填充共享区 } }, { repo: 'git@github.com:example-org/user-service.git', branch: 'feature/new-endpoint', targetDir: 'services/user-service', projectName: 'user-service', autoCommit: { // 此项目将使用共享的提交信息 enabled: true, useSharedCommits: true, // 明确指定使用共享信息 // watchAuthor, maxScanCount, commitSeparator 在此模式下可不填,若填写了则在共享区为空时作为回退 message: 'chore(user-service): auto sync from upstream [skip ci]', push: true } }, { repo: 'git@github.com:example-org/another-service.git', branch: 'main', targetDir: 'services/another-service', projectName: 'another-service', autoCommit: { // 此项目独立进行提交检测 enabled: true, watchAuthor: '李四', // 不同的开发者或标准 message: 'chore(another-service): auto merge [skip ci]', push: false // 可能只提交不推送 } } ], taskOrder: ['localSync', 'updateGitProjects'] }) ] }); ``` ## 六、测试要求 ### 1. 单元测试 - 验证文件同步逻辑(包括清空、仅新增、过滤规则)。 - 验证Git项目管理核心操作(克隆、拉取、分支切换)。 - 验证针对单个Git项目的自动提交智能检测逻辑(包括开发者监听、分隔符处理、提交信息生成、提交后操作)。 - **验证共享提交信息缓冲机制**: - 源项目成功获取并缓存提交信息。 - 后续项目配置`useSharedCommits: true`时能正确使用缓存信息。 - 当共享缓冲为空时,配置了`useSharedCommits: true`的项目能正确回退到独立扫描(或按配置跳过)。 - 未配置`useSharedCommits: true`的项目不受共享缓冲影响。 - 验证任务编排顺序。 ### 2. 集成测试 - 模拟完整部署流程,包含多个Git项目,组合使用独立提交、共享提交源、共享提交消费者等场景。 - 验证日志记录功能,清晰反映各项目的提交方式(独立、共享、来源)。 - 测试不同场景下单个Git项目的自动提交(有分隔符、无分隔符、无匹配提交、提交冲突、推送成功/失败),包括作为共享源和消费者的不同行为。 ### 3. 边缘情况测试 - 文件冲突处理。 - Git项目不存在或认证失败。 - 网络异常处理。 - 单个Git项目中重复提交分隔符处理。 - **共享提交信息在任务开始时被正确清空**。 ## 七、交付物 1. **源代码**:完整的TypeScript源码 2. **文档**: - 使用说明 - 配置参数文档 - 开发指南 3. **测试用例**:单元测试和集成测试代码 4. **示例项目**:演示插件功能的示例配置 ### 3. 配置接口定义 ```typescript interface GitProjectAutoCommitConfig { enabled?: boolean; // 是否启用,默认false watchAuthor?: string; // 监听的开发者用户名 (当useSharedCommits为false或作为共享提交源时建议填写) maxScanCount?: number; // 最大扫描提交记录数,默认50 commitSeparator?: string; // 提交分隔符,默认'/** 提交分隔符 **/' message?: string; // 自动提交消息模板 (可选, 有默认值) push?: boolean; // 是否推送到远程,默认false useSharedCommits?: boolean; // 可选,是否尝试使用共享的提交信息,默认false } interface GitProjectConfig { repo: string; // 仓库地址(SSH或HTTPS) branch: string; // 目标分支 targetDir: string; // 存放目录(相对项目根目录) projectName?: string; // 可选:重命名项目目录 updateIfExists?: boolean; // 存在时是否更新,默认true autoCommit?: GitProjectAutoCommitConfig; // 可选的自动提交配置 } interface LocalSyncConfig { source: string; // 源目录/文件(相对项目根目录) target: string; // 目标目录/文件(相对项目根目录) mode?: 'copy' | 'mirror' | 'incremental'; // 同步模式,默认'incremental' clearTarget?: boolean; // 是否同步前清空目标目录,默认false addOnly?: boolean; // 是否仅新增(目标不存在的文件/目录),默认false exclude?: string[]; // 排除文件/目录的正则表达式数组 excludeDirs?: string[]; // 排除目录(glob或正则表达式) excludeFiles?: string[]; // 排除文件(glob或正则表达式) } interface TurborepoDeployConfig { localSync?: Array; gitProjects?: Array; taskOrder?: Array<'localSync' | 'updateGitProjects'>; // 任务执行顺序 } ```