# front-template-cli
**Repository Path**: hokichen/front-template-cli
## Basic Information
- **Project Name**: front-template-cli
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-09-11
- **Last Updated**: 2026-09-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# cyzn
公司内部前端脚手架 CLI。基于模板目录动态注册命令,**模板目录名 = 命令名**,新增模板无需修改任何 CLI 代码。
## 特性
- `cyzn <模板名> <项目名> --title <标题>` 创建项目(如 `cyzn template my-app --title 订单管理平台`)
- **默认不安装依赖**,只拷贝渲染模板;需要时加 `--install` 才安装
- `--title <标题>` **必填**,`--port <端口>` 可选,用于自定义浏览器标题与开发端口
- 模板继承:`meta.json` 中 `extends` 可复用其他模板的工程配置,只覆盖差异文件
- 模板中 `_` 开头的文件生成时重命名为 `.` 开头(`_gitignore` → `.gitignore`)
- 生成的项目自动删除 `.git`,并按 `svn-ignore.txt` 设置 `svn:ignore`
- 统一使用 TypeScript + npm
## 安装
```bash
npm install cyzn -g
```
本地开发调试:
```bash
npm install
npm link # 之后可直接使用 cyzn 命令
```
## 使用
```bash
# --title 必填;默认只拷贝模板,不装依赖
cyzn template my-app --title 订单管理平台
# 输出:cd my-app && npm install && npm start
# 需要自动装依赖时(固定使用 npm)
cyzn template my-app --title 订单管理平台 --install
# 输出:cd my-app && npm start
# 自定义标题与开发端口
cyzn template my-app --title 订单管理平台 --port 9000
# 生成项目 .env 中 REACT_APP_TITLE=订单管理平台、PORT/WDS_SOCKET_PORT=9000
# 查看模板列表 / 版本 / 帮助
cyzn list
cyzn -v
cyzn -h
```
### 命令一览
| 命令 | 作用 |
|---|---|
| `npm install cyzn -g` | 全局安装脚手架 |
| `cyzn template <项目名> --title <标题>` | 用 `templates/template/` 模板创建项目(不装依赖) |
| `cyzn <其他模板名> <项目名> --title <标题>` | 用 `templates/<其他模板名>/` 创建项目 |
| `cyzn <模板名> <项目名> --title <标题> --install` | 创建项目并自动安装依赖 |
| `cyzn <模板名> <项目名> --title <标题> --port <端口>` | 自定义浏览器标题与开发端口 |
| `cyzn list` | 列出所有可用模板 |
| `cyzn -v` / `--version` | 查看版本 |
| `cyzn -h` / `--help` | 查看帮助 |
通用选项(所有模板命令都支持):
- `--install`:创建后自动安装依赖(**默认不装**,固定使用 `npm`)
- `--title <标题>`:**必填**。浏览器标签页标题,写入生成项目 `.env` 的 `REACT_APP_TITLE`,再由 `public/index.html` 的 `
%REACT_APP_TITLE%` 注入
- `--port <端口>`:本地开发端口,写入生成项目 `.env` 的 `PORT` 与 `WDS_SOCKET_PORT`;默认 `8008`
> 不支持 `--pm` / `--js`:包管理器固定为 npm,语言固定为 TypeScript。
> 注意:`cyzn` 后面必须带模板名或 `list`,不带时输出帮助信息。不存在 `cyzn <项目名>` 这种省略模板名的形式。
## 项目结构
```
cyzn/
├── package.json
├── bin/
│ └── index.js # CLI 入口,动态注册模板命令
├── src/
│ ├── commands/
│ │ └── create.js # 为每个模板注册 commander 子命令
│ ├── install.js # 依赖安装(固定 npm,仅 --install 时调用)
│ ├── render.js # 模板渲染拷贝(ejs、extends、下划线重命名)
│ ├── svn.js # 删除 .git、设置 svn:ignore
│ ├── logger.js # 日志封装
│ └── templates.js # 扫描 templates 目录
├── templates/
│ └── template/ # cyzn template <项目名>(当前仅此一个模板)
└── README.md
```
## 新增模板(零代码改动)
1. 在 `templates/` 下新建目录,**目录名即为命令名**,例如 `templates/admin/` → `cyzn admin <项目名>`(当前只有 `templates/template/`)。
2. 在目录下新建 `meta.json`:
```json
{
"name": "admin",
"description": "运营后台模板",
"extends": null
}
```
3. 放入模板文件。文件命名约定:
- `*.ejs` 会作为 EJS 模板渲染,可用变量 `projectName`、`title`、`port`,渲染后去掉 `.ejs` 后缀(`package.json.ejs` → `package.json`)。
- **模板根目录**下 `_xxx` 会重命名为 `.xxx`(`_gitignore` → `.gitignore`),避免 npm 发布丢失点文件。只处理第一层,源码里的下划线文件(如 `src/styles/_mixin.scss`)保持原样。
- `meta.json`、`node_modules`、`.git`、`.svn` 不会拷贝。
4. 重启/重新执行 `cyzn list` 即可看到新模板,无需修改任何代码。
### 模板继承
子模板的 `meta.json` 设置 `"extends": "template"` 后,会先渲染 `template`,再用子模板覆盖同名文件,只写差异部分。
> 当前仓库只提供 `template` 一个模板,但 CLI 的「扫描目录动态注册命令 + `extends` 继承」能力完整保留,后续新增模板无需改动任何代码。
## 模板内容约定
模板只提供**最小可运行骨架**(能 `npm start` 起来即可)。通用方法(请求拦截器、`useTable`、权限组件等)统一用 `// TODO: 按公司规范补充` 标注,由使用方按公司规范补齐。
## SVN 说明
- 生成的项目不含 `.git` 目录。
- 每个模板都带 `svn-ignore.txt`(`node_modules`、`build`、`.env.local`、`*.log` 等)。
- `package.json` 中已内置脚本:
```bash
npm run svn:ignore
# 等价于 svn propset svn:ignore -F svn-ignore.txt .
```
- 首次提交前请执行一次 `npm run svn:ignore`。CLI 在创建项目时若检测到当前处于 SVN 工作副本,会自动执行该命令。
- 不使用 husky,lint 通过 `npm run lint` 手动或 CI 执行。
## 发布
### 1. 登录
```bash
npm login
npm whoami # 确认已登录
```
推公司私有源时指定 registry:
```bash
npm login --registry=http://your-nexus/repository/npm-hosted/
```
### 2. 确认包名可用
```bash
npm view cyzn
```
返回 404 表示未被占用,可以发布。
### 3. 发布预检(推荐)
```bash
npm pack --dry-run
```
重点确认:
- 输出里能看到 `templates/template/` 下的全部文件,特别是 `package.json.ejs`
- 点文件 `templates/template/.env`、`.prettierrc.cjs`、`.prettierignore` 都在(npm 不会自动排除它们,但被忽略过一次就很难查)
- `templates/` 里没有混进 `node_modules`
也可以打成本地包先装一遍验证:
```bash
npm pack # 生成 cyzn-1.0.0.tgz
npm i -g ./cyzn-1.0.0.tgz # 全局安装本地包
cyzn list # 在新目录里执行,确认模板可用
npm uninstall -g cyzn
```
### 4. 发布
```bash
npm publish
```
推私有源时:
```bash
npm publish --registry=http://your-nexus/repository/npm-hosted/
```
若希望永久写死源,可固定到 `package.json`:
```json
{
"publishConfig": {
"registry": "http://your-nexus/repository/npm-hosted/"
}
}
```
### 5. 验证
```bash
npm view cyzn version
npm i -g cyzn
cyzn list
```
### 6. 后续更新
改了模板或代码后,先升版本再发布:
```bash
npm version patch # 1.0.0 -> 1.0.1,修 bug
npm version minor # 1.0.0 -> 1.1.0,加模板
npm version major # 1.0.0 -> 2.0.0,不兼容变更
npm publish
```
### 注意事项
- `package.json` 的 `files` 必须包含 `templates`,否则发布后模板会丢失。
- 模板目录名 = 命令名,发布后新增模板需要重新发版,无法热更新。
- `templates/template/package-lock.json` 约 878 KB,占包体积大部分。保留可让新项目依赖版本更稳定、安装更快;若不需要,可从模板中移除,由使用者 `npm install` 自行生成。
- 不建议把模板内的 `node_modules` 提交到仓库,npm 虽会排除它,但会让 `npm pack` 变慢。