CLI tool for DAO Style projects - providing project scaffolding, template generation and dependency management
DAO Style 项目的命令行工具 - 提供项目脚手架、模板生成和依赖管理功能。
- NPM Template System: 使用 @dao-style-template/ 组织下的 npm 包作为模板
- Version Management: 模板版本自动写入 devDependencies,支持版本追踪
- Smart Upgrade: 检测可升级的模板版本,支持三方合并和冲突解决
- Post-install Tasks: 自动执行模板的安装后任务
- Template Cache: 智能缓存下载的模板,提升性能
- Node.js >= 20.0.0
- pnpm >= 9.0.0
``bash`
npm install -g @dao-style/cli
或
pnpm add -g @dao-style/cli
项目使用 @dao-style-template/ 组织下的 npm 包作为模板:
- @dao-style-template/base - 基础项目结构@dao-style-template/lint
- - ESLint 和代码格式化配置 @dao-style-template/ci
- - CI/CD 配置
模板的具体版本会自动写入项目的 devDependencies:
`json`
{
"devDependencies": {
"@dao-style-template/base": "1.0.0",
"@dao-style-template/lint": "1.2.0",
"@dao-style-template/ci": "1.1.0"
}
}
project-name 为项目名称,无需包含 ui ,ui 会根据项目名称自动生成。
`bash`
dao create
#### 基础用法
`bash`
dao create my-app
创建新项目,自动:
- 下载最新版本的模板
- 生成项目文件
- 将模板版本写入 devDependencies
- 设置 postinstall 钩子
#### 可选参数
| 参数 | 简写 | 说明 | 默认值 |
| --------------------------- | ---- | ------------------------------------------------------------- | -------- |
| --initial-branch | -b | 设置初始分支名称 | master |--local
| | - | 使用本地模板(开发调试用) | - |--all-templates
| | - | 选择所有可用模板 | - |--answer
| | - | 提供模板提示的答案,格式:template.prompt=value,可重复使用 | - |
#### 高级用法示例
1. 使用所有模板并预设答案
`bash`
dao create test --all-templates \
--answer base.packages=@dao-style/core,@dao-style/extend,@dao-style/biz \
--answer base.port=8100
这个命令会:
- 创建名为 test 的项目packages
- 应用所有可用的模板
- 预设 base 模板的 参数为 @dao-style/core,@dao-style/extend,@dao-style/bizport
- 预设 base 模板的 参数为 8100
2. 自定义初始分支
`bash`
dao create my-app --initial-branch main
3. 使用本地模板(开发调试)
`bash`
dao create test-project --local
`bash`
dao list
查看当前项目安装的模板版本和可用更新:
`
📦 Installed Templates:
base: 1.0.0 → 1.2.0 (update available)
lint: 1.1.0 (up to date)
ci: 1.0.0 → 1.1.0 (update available)
💡 Run "dao upgrade" to update templates.
`
`bash`
dao upgrade [options]
升级项目中的模板到最新版本,支持智能三方合并和冲突解决。
#### 可选参数
| 参数 | 说明 | 默认值 |
| --------- | -------------------------- | ------ |
| --local | 使用本地模板(开发调试用) | - |
#### 基础用法
`bash`
dao upgrade
该命令会:
1. 检查 Git 状态 - 确保工作目录干净(可用 --force 跳过)package.json
2. 检测可用更新 - 扫描所有已安装模板的新版本
3. 选择升级模板 - 交互式选择要升级的模板
4. 处理模板提示 - 智能判断是否需要重新回答 prompts
5. 执行三方合并 - 自动合并文件变更
6. 解决冲突 - 自动或手动解决冲突
7. 更新依赖 - 更新 并执行 pnpm install
1. 提交所有更改 - 升级前确保所有代码已提交到 Git
2. 创建备份分支 - 建议创建备份分支: git checkout -b backup-before-upgradedao list
3. 了解变更内容 - 使用 查看可用更新
4. 测试升级结果 - 升级后运行测试确保功能正常
#### 升级后的操作
1. 解决冲突 - 如果有冲突,先解决所有冲突标记
2. 运行开发服务器 - pnpm serve 确保项目能正常启动pnpm lint
3. 执行 Lint 检查 - 确保代码规范pnpm test:unit
4. 运行测试 - 确保功能正常git add .
5. 提交更改 - 和 git commit -m "chore: upgrade templates"
#### 升级流程示例
`bash
$ dao upgrade
Opening conflicts in VS Code...
`
升级时会智能判断是否需要重新回答 prompts:
#### 场景 1:Prompts 完全相同
- 行为:只询问一次,使用新版本的 prompts
- 原因:避免重复输入相同的问题
#### 场景 2:Prompts 不同
- 行为:分别询问原始版本和目标版本的 prompts
- 原因:需要分别计算原始和目标的模板渲染结果
#### 场景 3:新增模板
- 行为:只询问新模板的 prompts
- 原因:原始版本不存在该模板
#### 场景 4:移除模板
- 行为:只询问原始模板的 prompts
- 原因:需要计算原始版本用于三方合并
升级过程会根据不同情况采取不同的处理策略:
#### 1. SKIP(跳过)
- 本地文件与目标文件相同 → 已是最新
- 合并后无变化 → 无需更新
- 模板未变且本地已删除 → 尊重本地删除
- 本地修改过的文件,模板已删除 → 保留本地修改
#### 2. UPDATE(直接更新)
- 本地文件与原始模板相同 → 直接用新模板覆盖
`bash`
✓ Updated: src/main.ts
#### 3. MERGE(合并)
- 本地有修改,模板也有更新 → 执行三方合并
- 无冲突时自动合并
`bash`
✓ Merged: vite.config.ts
#### 4. MERGE with CONFLICTS(冲突合并)
- 合并时发现冲突 → 生成冲突标记
`bash`
⚠ Merged with conflicts: .eslintrc.js
#### 5. ADD(新增)
- 新模板添加的文件
`bash`
✓ Added: src/types/global.d.ts
#### 6. DELETE(删除)
- 模板删除了文件,且本地未修改
`bash`
✓ Deleted: old-config.js
升级过程能正确处理二进制文件(图片、字体等):
- 识别:根据文件扩展名识别(.png, .jpg, .ttf, .woff 等)
- 编码:使用 base64 编码处理
- 比较:通过内容哈希判断是否相同
- 合并:冲突时默认使用新版本
升级过程使用智能三方合并算法,比较三个版本的文件,实际使用的是 git 命令 git merge-file 来执行三方合并。
``
┌─────────────┐
│ Original │ ← 之前安装的模板版本
│ (Base 版本) │
└──────┬──────┘
│
┌───────┴───────┐
↓ ↓
┌──────────┐ ┌──────────┐
│ Local │ │ Target │
│ (当前版本) │ │ (新模板版本)│
└──────────┘ └──────────┘
│ │
└───────┬───────┘
↓
┌──────────┐
│ Merged │ ← 合并结果
└──────────┘$3
当自动合并失败时,会在文件中生成冲突标记:
`javascript`
<<<<<<< HEAD
// 当前项目的代码
const config = {
port: 8080,
old: 'value'
};
=======
// 新模板的代码
const config = {
port: 8100,
new: 'value',
updated: true
};
>>>>>>> template
解决冲突的步骤:
1. 自动打开编辑器 - 如果安装了 VS Code,会自动打开冲突文件
2. 手动解决冲突 - 编辑文件,删除冲突标记,保留需要的代码
3. 测试验证 - 确保项目能正常运行
4. 提交更改 - git add . 和 git commit
运行以下命令将会将本地的 dao 命令自动的 link 到全局,同时在退出时会自动取消 link
`bash`
pnpm dev # 运行开发环境,会监听文件变动并重新编译
`bashcreate
dao create test-project --local