mirror of https://github.com/allinssl/allinssl
![]() |
||
---|---|---|
.. | ||
src | ||
tests/unit | ||
.gitignore | ||
CHANGELOG.md | ||
README.md | ||
package.json | ||
tsconfig.json | ||
vite.config.ts | ||
vitest.config.ts |
README.md
vite-plugin-turborepo-deploy
Vite插件,用于自动化Turborepo工作区编译部署,包含本地文件同步、Git项目管理和智能自动提交功能。
功能特点
1. 本地文件同步
- 支持多种同步模式:复制、镜像、增量更新
- 支持目标目录清空、仅添加新文件
- 灵活的文件过滤规则:正则表达式、glob模式
- 自动解析相对路径
- 在构建完成后执行
2. Git项目管理
- 多项目支持:配置多个Git项目的拉取/更新任务
- 自动分支管理:自动切换到指定分支
- 专注于仓库维护,不包含自动提交功能
- 集中存放:所有Git项目统一存放在工作区根目录的
.sync-git
目录下 - 在构建完成后最先执行
3. 独立的智能自动提交模块
- 完全独立于Git项目管理,作为单独模块运行
- 在Git项目管理和文件同步后执行,保证数据一致性
- 支持强大的自动提交功能:
- 监听特定开发者的提交
- 提交分隔符识别
- 跨项目的共享提交信息机制
- 自动处理重复分隔符
- 支持多项目并发处理
- 在构建完成后最后执行
4. 顺序执行任务
- 所有任务在构建完成后的
closeBundle
钩子中执行 - 按固定顺序依次执行:Git项目管理 → 本地文件同步 → 自动提交
- 前一任务出错会中止后续任务
5. 日志记录系统
- 多级日志:error、warn、info、verbose
- 控制台彩色输出
- 按日期生成日志文件
6. 工作区根目录检测
- 自动检测Turborepo/PNPM/Yarn/NPM工作区根目录
- 所有路径(Git项目、文件同步、日志等)都基于工作区根目录
- 支持monorepo中的子项目使用相同的配置
- 所有Git项目统一存放在
.sync-git
目录下,便于管理
安装
npm install vite-plugin-turborepo-deploy --save-dev
# 或
yarn add vite-plugin-turborepo-deploy --dev
# 或
pnpm add vite-plugin-turborepo-deploy --save-dev
使用方法
在vite.config.ts
中配置插件:
// vite.config.ts
import { defineConfig } from 'vite';
import turborepoDeploy from 'vite-plugin-turborepo-deploy';
export default defineConfig({
plugins: [
turborepoDeploy({
// 本地文件同步配置 (在Git项目管理后执行)
// 路径相对于工作区根目录
localSync: [
{
source: 'dist',
target: 'deploy/public', // 相对于工作区根目录
mode: 'mirror',
clearTarget: true
},
{
source: 'src/assets',
target: 'deploy/assets', // 相对于工作区根目录
excludeDirs: ['**/tmp'],
excludeFiles: ['**/*.psd']
},
{
source: 'dist/shared',
target: [ // 使用数组实现文件分发到多个目标路径
'deploy/site-a/shared',
'deploy/site-b/shared',
'deploy/site-c/shared'
],
mode: 'incremental'
}
],
// Git项目管理配置 (最先执行)
// 所有Git项目都存放在工作区根目录的.sync-git目录下
gitProjects: [
{
repo: 'git@github.com:example-org/api-gateway.git',
branch: 'develop',
targetDir: 'api-gateway', // 相对于.sync-git目录
projectName: 'API网关', // 用于日志中清晰标识
updateIfExists: true,
discardChanges: false // 默认不丢弃未提交的更改
},
{
repo: 'git@github.com:example-org/user-service.git',
branch: 'feature/new-endpoint',
targetDir: 'user-service', // 相对于.sync-git目录
projectName: '用户服务',
updateIfExists: true,
discardChanges: true // 自动丢弃所有未提交的更改(谨慎使用)
}
],
// 自动提交配置 (最后执行)
// 路径相对于.sync-git目录
autoCommit: {
// 启用在项目间共享提交信息
enableSharedCommits: true,
// 在提交后添加分隔符
insertSeparator: true,
// 要处理的项目列表
projects: [
{
targetDir: 'api-gateway', // 相对于.sync-git目录
projectName: 'API网关', // 用于日志标识
watchAuthor: '张三', // 作为提交信息来源
maxScanCount: 100,
commitSeparator: '/** 提交分隔符 **/',
message: 'chore(api-gateway): auto merge [skip ci]',
push: true,
// 不使用共享提交信息,作为提交信息源
useSharedCommits: false,
// 可以指定分支,不指定则使用当前分支
branch: 'develop'
},
{
targetDir: 'user-service', // 相对于.sync-git目录
projectName: '用户服务',
// 不需要watchAuthor,因为使用共享提交信息
useSharedCommits: true, // 使用共享信息
message: 'chore(user-service): auto sync from upstream [skip ci]',
push: true,
branch: 'feature/new-endpoint'
}
]
},
// 日志配置
// 路径相对于工作区根目录
logger: {
level: 'info',
writeToFile: true,
logDir: '.sync-log' // 相对于工作区根目录
}
})
]
});
工作区根目录检测
插件会自动检测工作区的根目录,具体检测规则如下:
- 查找
turbo.json
文件的存在(Turborepo) - 检查
package.json
中的workspaces
配置(Yarn/NPM Workspaces) - 查找
pnpm-workspace.yaml
文件的存在(PNPM Workspaces)
如果找到以上任一标志,则使用该目录作为工作区根目录;如果未找到,则使用Vite项目的根目录。
注意:
- 所有配置中的相对路径都相对于工作区根目录,而非Vite项目的根目录。这使得多个子项目可以共享相同的配置。
- Git项目都存放在工作区根目录下的
.sync-git
目录中,配置中的targetDir
是相对于.sync-git
目录的路径。 - 自动提交中的
targetDir
也是相对于.sync-git
目录的路径。
配置选项
主配置
选项 | 类型 | 默认值 | 描述 | 执行顺序 |
---|---|---|---|---|
gitProjects |
Array<GitProjectConfig> |
- | Git项目管理配置数组 | 1 |
localSync |
Array<LocalSyncConfig> |
- | 本地文件同步配置数组 | 2 |
autoCommit |
AutoCommitConfig |
- | 独立的自动提交模块配置 | 3 |
logger |
LoggerConfig |
- | 日志配置 | 全局 |
LocalSyncConfig
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
source |
string |
- | 源目录/文件(相对于工作区根目录) |
target |
string | string[] |
- | 目标目录/文件(相对于工作区根目录),可以是单个路径或多个路径数组以实现文件分发 |
mode |
'copy' | 'mirror' | 'incremental' |
'incremental' |
同步模式 |
clearTarget |
boolean |
false |
是否同步前清空目标目录 |
addOnly |
boolean |
false |
是否仅添加新文件 |
exclude |
string[] |
- | 排除文件/目录的正则表达式数组 |
excludeDirs |
string[] |
- | 排除目录的glob模式数组 |
excludeFiles |
string[] |
- | 排除文件的glob模式数组 |
GitProjectConfig
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
repo |
string |
- | 仓库地址(SSH或HTTPS) |
branch |
string |
- | 目标分支 |
targetDir |
string |
- | 存放目录(相对于.sync-git目录) |
projectName |
string |
- | 项目名称(用于日志) |
updateIfExists |
boolean |
true |
存在时是否更新 |
discardChanges |
boolean |
false |
是否自动丢弃未提交的更改,设为true时会执行git checkout -- . 和 git clean -fd |
AutoCommitConfig
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
projects |
Array<AutoCommitProjectConfig> |
- | 自动提交项目配置数组 |
enableSharedCommits |
boolean |
true |
是否启用共享提交信息功能 |
insertSeparator |
boolean |
true |
是否在提交后插入分隔符 |
AutoCommitProjectConfig
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
targetDir |
string |
- | 项目目录(相对于.sync-git目录) |
projectName |
string |
targetDir |
项目名称(用于日志) |
watchAuthor |
string |
- | 监听的开发者用户名(非共享模式必须) |
maxScanCount |
number |
50 |
最大扫描提交记录数 |
commitSeparator |
string |
'/** 提交分隔符 **/' |
提交分隔符 |
message |
string |
- | 自动提交消息模板 |
push |
boolean |
false |
是否推送到远程 |
useSharedCommits |
boolean |
false |
是否使用共享提交信息 |
branch |
string |
当前分支 | 要操作的分支 |
LoggerConfig
选项 | 类型 | 默认值 | 描述 |
---|---|---|---|
level |
'error' | 'warn' | 'info' | 'verbose' |
'info' |
日志级别 |
writeToFile |
boolean |
true |
是否写入日志文件 |
logDir |
string |
'.sync-log' |
日志目录(相对于工作区根目录) |
工作原理
插件执行流程
插件在Vite构建完成后执行所有任务:
-
初始化阶段(
configResolved
钩子):- 检测Turborepo工作区根目录
- 所有路径计算基于工作区根目录
- 加载并验证配置
-
构建完成阶段(
closeBundle
钩子):- 按固定顺序依次执行:
- Git项目管理:克隆或更新指定的仓库
- 本地文件同步:处理编译生成的文件
- 智能自动提交:将更改提交到Git仓库
- 按固定顺序依次执行:
本地文件同步
- 复制模式:简单复制源到目标,不处理目标中已存在的文件
- 镜像模式:镜像同步,删除目标中不存在于源的文件
- 增量模式:仅覆盖已变更文件
Git项目管理
- 检查项目是否存在:
- 存在则执行
git pull
更新 - 不存在则执行
git clone
- 存在则执行
- 切换到指定分支
- 不再包含自动提交功能,仅负责仓库维护
独立的自动提交机制
-
作为单独模块运行,在Git项目管理和文件同步后执行
-
自动提交流程:
- 扫描指定作者的提交记录
- 识别提交分隔符,获取有效提交
- 生成合并提交信息
- 推送到远程仓库(如果配置)
- 插入新的提交分隔符
-
共享提交信息机制:
- 第一个成功获取提交信息的项目,其结果将被缓存
- 后续项目可以使用此共享信息进行提交
许可证
MIT