@icebreakers/monorepo-templates 0.1.16 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/assets/.changeset/config.json +7 -2
- package/assets/.github/workflows/ci.yml +8 -2
- package/assets/.github/workflows/release.yml +2 -2
- package/assets/.husky/commit-msg +1 -1
- package/assets/.husky/pre-commit +1 -1
- package/assets/.husky/pre-push +5 -0
- package/assets/AGENTS.md +8 -7
- package/assets/Dockerfile +5 -14
- package/assets/commitlint.config.ts +2 -2
- package/assets/eslint.config.js +2 -6
- package/assets/lint-staged.config.js +3 -0
- package/assets/package.json +41 -31
- package/assets/repoctl.config.ts +68 -0
- package/assets/stylelint.config.js +2 -2
- package/assets/tsconfig.json +1 -49
- package/assets/turbo.json +17 -6
- package/assets/vitest.config.ts +2 -125
- package/assets-data.mjs +3 -2
- package/dist/index.d.mts +22 -1
- package/dist/index.mjs +114 -32
- package/package.json +12 -8
- package/template-data.mjs +48 -8
- package/templates/cli/bin/index.js +1 -1
- package/templates/cli/package.json +5 -2
- package/templates/cli/{tsup.config.ts → tsdown.config.ts} +3 -2
- package/templates/client/eslint.config.js +5 -5
- package/templates/client/gitignore +0 -1
- package/templates/client/package.json +22 -22
- package/templates/client/vite.config.ts +4 -3
- package/templates/client/worker-configuration.d.ts +13557 -0
- package/templates/client/wrangler.jsonc +4 -6
- package/templates/server/eslint.config.js +8 -0
- package/templates/server/gitignore +0 -1
- package/templates/server/package.json +9 -8
- package/templates/server/src/app.ts +4 -4
- package/templates/server/tsconfig.json +1 -2
- package/templates/server/{tsup.config.ts → tsdown.config.ts} +2 -1
- package/templates/server/vitest.config.ts +7 -5
- package/templates/server/worker-configuration.d.ts +13557 -0
- package/templates/server/wrangler.jsonc +4 -6
- package/templates/tsdown/package.json +2 -1
- package/templates/tsdown/test-d/index.test-d.ts +5 -0
- package/templates/tsdown/tsconfig.json +1 -2
- package/templates/tsdown/vitest.config.ts +7 -5
- package/templates/vitepress/.vitepress/config.ts +34 -36
- package/templates/vitepress/getting-started.md +243 -0
- package/templates/vitepress/gitignore +2 -1
- package/templates/vitepress/index.md +144 -79
- package/templates/vitepress/monorepo/commands.md +291 -0
- package/templates/vitepress/monorepo/index.md +103 -34
- package/templates/vitepress/monorepo/manage.md +181 -80
- package/templates/vitepress/monorepo/publish.md +128 -57
- package/templates/vitepress/monorepo/templates.md +67 -0
- package/templates/vitepress/monorepo/troubleshooting.md +226 -0
- package/templates/vitepress/package.json +5 -5
- package/templates/vitepress/thinking.md +1 -1
- package/templates/vitepress/tools/husky.md +7 -2
- package/templates/vitepress/tools/lint-staged.md +15 -1
- package/templates/vitepress/why/examples/3.npm-basic-package/package-lock.json +605 -2770
- package/templates/vitepress/why/examples/3.npm-basic-package/package.json +5 -6
- package/templates/vitepress/why/examples/3.npm-basic-package/tsdown.config.ts +16 -0
- package/templates/vitepress/why/examples/usage-cjs/index.js +2 -6
- package/templates/vitepress/why/examples/usage-cjs/package-lock.json +7 -13
- package/templates/vitepress/why/examples/usage-cjs/package.json +2 -2
- package/templates/vitepress/why/examples/usage-esm/index.js +2 -2
- package/templates/vitepress/why/examples/usage-esm/package-lock.json +7 -13
- package/templates/vitepress/why/examples/usage-esm/package.json +2 -2
- package/templates/vitepress/why/modern/bundlers.md +19 -46
- package/templates/vue-lib/eslint.config.js +4 -4
- package/templates/vue-lib/package.json +15 -10
- package/templates/vue-lib/test-d/index.test-d.ts +6 -0
- package/templates/vue-lib/tsconfig.test.json +1 -1
- package/templates/vue-lib/vitest.config.ts +6 -5
- package/assets/monorepo.config.ts +0 -22
- package/assets/nano-staged.js +0 -18
- package/templates/tsup/build.config.ts +0 -24
- package/templates/tsup/package.json +0 -49
- package/templates/tsup/src/index.ts +0 -12
- package/templates/tsup/test/index.test.ts +0 -18
- package/templates/tsup/tsconfig.json +0 -15
- package/templates/tsup/tsup.config.ts +0 -18
- package/templates/tsup/vitest.config.ts +0 -15
- package/templates/unbuild/build.config.ts +0 -24
- package/templates/unbuild/package.json +0 -49
- package/templates/unbuild/src/index.ts +0 -9
- package/templates/unbuild/src/utils.ts +0 -5
- package/templates/unbuild/test/index.test.ts +0 -18
- package/templates/unbuild/tsconfig.json +0 -15
- package/templates/unbuild/vitest.config.ts +0 -15
- package/templates/vitepress/why/examples/3.npm-basic-package/build.config.ts +0 -24
- package/templates/vitepress/why/examples/3.npm-basic-package/tsup.config.ts +0 -16
|
@@ -1,46 +1,115 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 为什么往 monorepo 方向演进
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
选择 monorepo,不是为了“更先进”,而是为了把多包协作里最常见的重复劳动砍掉。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
当你的仓库里同时存在应用、类库、CLI、文档站,或者多个团队要共享同一套类型、配置、脚手架时,monorepo 的收益会很快超过它的管理成本。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
| -------- | ------------------------------------------------------------------ |
|
|
9
|
-
| 依赖管理 | `pnpm` 等工具会共享缓存、避免重复安装;严格依赖隔离杜绝“幽灵依赖” |
|
|
10
|
-
| 构建效率 | 借助 Turborepo 的缓存与依赖图,仅构建真正改动的包,CI 时间显著降低 |
|
|
11
|
-
| 原子提交 | 一个提交即可跨多个模块同步改动,便于回滚与审计 |
|
|
12
|
-
| 协作体验 | 同一仓库统一配置、脚本与规范,减少跨项目跳转和环境差异 |
|
|
13
|
-
| 可复用性 | 公共库、UI 组件、工具函数在 workspace 内即可本地引用并共享 |
|
|
7
|
+
## 这套模板解决的真实问题
|
|
14
8
|
|
|
15
|
-
|
|
9
|
+
### 1. 依赖和脚本不再分散
|
|
16
10
|
|
|
17
|
-
|
|
18
|
-
| -------------------------------- | -------------------------------------------------- |
|
|
19
|
-
| 每个仓库单独装依赖、重复维护脚本 | Workspace 共享依赖与脚本,一次配置多处使用 |
|
|
20
|
-
| 同步多个仓库中的接口或配置 | 原子提交 + Turborepo 构建,修改一次即可全仓库生效 |
|
|
21
|
-
| CI/CD 配置分散、发布流程冗长 | 基于 changesets 和统一仓库配置快速搭建自动化流水线 |
|
|
22
|
-
| 大规模重构成本高 | 搜索范围集中,易于批量修改、验证与回滚 |
|
|
11
|
+
在 polyrepo 里,最常见的问题不是代码本身,而是:
|
|
23
12
|
|
|
24
|
-
|
|
13
|
+
- 每个仓库都要单独装依赖
|
|
14
|
+
- 每个仓库都维护一套 lint / typecheck / test 脚本
|
|
15
|
+
- 同样的工具链升级要重复做很多次
|
|
16
|
+
- 团队成员很难判断哪个仓库的规范才是“当前标准”
|
|
25
17
|
|
|
26
|
-
|
|
27
|
-
- **组件库/工具链**:公共 API 与内部应用一起维护,避免版本漂移。
|
|
28
|
-
- **微服务集成**:多个服务共享协议、类型定义,发布与部署流程统一。
|
|
29
|
-
- **巨石拆分**:将原有大型项目拆成多个 package,逐步抽象并复用。
|
|
18
|
+
在 monorepo 里,这些东西可以收敛到一个根目录。
|
|
30
19
|
|
|
31
|
-
|
|
20
|
+
### 2. 跨包改动可以原子提交
|
|
32
21
|
|
|
33
|
-
|
|
34
|
-
2. **逐步迁移模块**:按照业务领域或团队边界迁移子模块,保留原 CI 作为兜底。
|
|
35
|
-
3. **引入构建缓存**:配置 Turborepo,使用 `turbo run <task> --filter=<scope>` 控制任务范围。
|
|
36
|
-
4. **接入 changesets**:在迁移过程中就开始记录版本与变更,养成可发布的节奏。
|
|
37
|
-
5. **通过 monorepo.config.ts 定制命令**:按团队习惯调整 `create` 模板、`clean` 行为、`upgrade` 目标等,提高可维护性。
|
|
22
|
+
如果一个接口变更同时影响:
|
|
38
23
|
|
|
39
|
-
|
|
24
|
+
- `packages/types`
|
|
25
|
+
- `packages/sdk`
|
|
26
|
+
- `apps/web`
|
|
27
|
+
- `apps/server`
|
|
40
28
|
|
|
41
|
-
|
|
42
|
-
- [发包与变更日志](./publish.md) —— 使用 changesets 管理版本、自动化发布。
|
|
43
|
-
- [工具专题](../tools/turborepo.md) —— 常用工具的配置与技巧。
|
|
44
|
-
- [常见思考](../thinking.md) —— 关于模块拆分、包结构的经验分享。
|
|
29
|
+
那么在 monorepo 里,一次提交就能把它们一起改完、一起验证、一起回滚。对重构和版本审计都更友好。
|
|
45
30
|
|
|
46
|
-
|
|
31
|
+
### 3. 构建与测试更容易增量化
|
|
32
|
+
|
|
33
|
+
`pnpm` 负责 workspace 依赖管理,`turborepo` 负责任务编排和缓存,结果就是:
|
|
34
|
+
|
|
35
|
+
- 没改动的包不需要重复构建
|
|
36
|
+
- CI 可以按依赖图只跑受影响任务
|
|
37
|
+
- 大仓库也能保持比较稳定的反馈速度
|
|
38
|
+
|
|
39
|
+
## 这套模板的立场
|
|
40
|
+
|
|
41
|
+
这不是一个“什么都能配”的框架,而是一套偏实战、偏收敛的默认值:
|
|
42
|
+
|
|
43
|
+
| 维度 | 默认选择 |
|
|
44
|
+
| -------- | ---------------------------------------------- |
|
|
45
|
+
| 包管理 | `pnpm workspace` |
|
|
46
|
+
| 任务编排 | `turborepo` |
|
|
47
|
+
| 语言 | TypeScript 优先 |
|
|
48
|
+
| 校验链路 | ESLint + Stylelint + typecheck + Vitest |
|
|
49
|
+
| 提交规范 | Husky + lint-staged + commitlint |
|
|
50
|
+
| 发包 | changesets |
|
|
51
|
+
| 命令入口 | `repo` 为主,`repoctl` / `monorepo` 为兼容入口 |
|
|
52
|
+
|
|
53
|
+
这些选择的目的只有一个:减少“每个项目重新想一遍”的成本。
|
|
54
|
+
|
|
55
|
+
## 什么时候适合用 monorepo
|
|
56
|
+
|
|
57
|
+
下面这些情况,适合直接上:
|
|
58
|
+
|
|
59
|
+
- 你要同时维护多个 npm 包
|
|
60
|
+
- 你有前后端、CLI、文档站共用一套类型或工具
|
|
61
|
+
- 你希望升级脚本、工程化配置时一次同步全仓
|
|
62
|
+
- 你有持续重构、跨包联动改动的需求
|
|
63
|
+
|
|
64
|
+
下面这些情况,不一定值得上:
|
|
65
|
+
|
|
66
|
+
- 只有一个很小的应用,没有共享代码需求
|
|
67
|
+
- 团队还没有接受统一规范的准备
|
|
68
|
+
- 构建链路本身还不稳定,先统一仓库只会放大问题
|
|
69
|
+
|
|
70
|
+
## 模板提供的补位能力
|
|
71
|
+
|
|
72
|
+
单纯有 monorepo 还不够,真正难的是“如何让它易用”。这个模板多补了三层东西:
|
|
73
|
+
|
|
74
|
+
### 1. 更短的日常命令
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pnpm setup
|
|
78
|
+
pnpm doctor
|
|
79
|
+
pnpm new
|
|
80
|
+
pnpm check
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
不用先背完整 CLI,先把日常路径跑顺。
|
|
84
|
+
|
|
85
|
+
### 2. `repo doctor` 这种面向新人的诊断命令
|
|
86
|
+
|
|
87
|
+
它会直接回答这些问题:
|
|
88
|
+
|
|
89
|
+
- 你是不是站在仓库根目录
|
|
90
|
+
- `pnpm-workspace.yaml` 在不在
|
|
91
|
+
- Node 版本对不对
|
|
92
|
+
- 有没有安装 CLI 依赖
|
|
93
|
+
- 根脚本齐不齐
|
|
94
|
+
- `repoctl.config.ts` 和 `monorepo.config.ts` 有没有冲突
|
|
95
|
+
- Husky / lint-staged 链路是不是半残状态
|
|
96
|
+
|
|
97
|
+
### 3. `repo upgrade` 这种面向存量仓库的同步命令
|
|
98
|
+
|
|
99
|
+
当模板默认值变了,你不需要手抄配置,只要选择性同步标准资产。
|
|
100
|
+
|
|
101
|
+
## 实际收益通常体现在这里
|
|
102
|
+
|
|
103
|
+
| 场景 | Polyrepo 常见成本 | Monorepo 常见收益 |
|
|
104
|
+
| ------------ | ------------------ | ---------------------- |
|
|
105
|
+
| 工具链升级 | 多仓重复改配置 | 一次升级,多包受益 |
|
|
106
|
+
| 共享类型变更 | 多仓分别发版联调 | 一次改动,一次验证 |
|
|
107
|
+
| CI 反馈 | 每仓重复跑全量 | 利用缓存和依赖图做增量 |
|
|
108
|
+
| 新人接手 | 先理解多个仓库差异 | 先理解一套统一约定 |
|
|
109
|
+
|
|
110
|
+
## 继续阅读
|
|
111
|
+
|
|
112
|
+
- [如何管理 monorepo](./manage.md)
|
|
113
|
+
- [命令速查](./commands.md)
|
|
114
|
+
- [排障指南](./troubleshooting.md)
|
|
115
|
+
- [发包与变更日志](./publish.md)
|
|
@@ -1,129 +1,230 @@
|
|
|
1
1
|
# 如何管理 monorepo
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这一页只讲一件事:拿到这套模板后,日常到底怎么用,才是最省心的。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 先记住默认工作流
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
```bash
|
|
8
|
+
pnpm install
|
|
9
|
+
pnpm doctor
|
|
10
|
+
pnpm new
|
|
11
|
+
pnpm check
|
|
12
|
+
pnpm build
|
|
13
|
+
```
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
大多数场景里,这已经够了。
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
如果你在接入一个旧仓库,再多加一步:
|
|
16
18
|
|
|
17
19
|
```bash
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
pnpm setup
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 命令分层
|
|
24
|
+
|
|
25
|
+
这套模板故意把入口做得很少。
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
### 第一层:根脚本
|
|
28
|
+
|
|
29
|
+
这是最推荐的入口:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pnpm setup
|
|
33
|
+
pnpm new
|
|
34
|
+
pnpm doctor
|
|
35
|
+
pnpm check
|
|
24
36
|
```
|
|
25
37
|
|
|
26
|
-
|
|
27
|
-
|
|
38
|
+
适合:
|
|
39
|
+
|
|
40
|
+
- 新人
|
|
41
|
+
- 日常开发
|
|
42
|
+
- 文档教程
|
|
43
|
+
- 团队内部统一约定
|
|
44
|
+
|
|
45
|
+
### 第二层:主 CLI
|
|
28
46
|
|
|
29
|
-
|
|
47
|
+
当你要明确告诉别人“这是 CLI 行为,不只是 package.json 脚本”时,用:
|
|
30
48
|
|
|
31
49
|
```bash
|
|
32
|
-
|
|
33
|
-
pnpm
|
|
34
|
-
pnpm
|
|
50
|
+
pnpm exec repo setup
|
|
51
|
+
pnpm exec repo new
|
|
52
|
+
pnpm exec repo doctor
|
|
53
|
+
pnpm exec repo check
|
|
54
|
+
pnpm exec repo upgrade
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 第三层:分组命令
|
|
35
58
|
|
|
36
|
-
|
|
37
|
-
pnpm build --filter={templates/client}
|
|
59
|
+
更细的高级操作保留在分组里:
|
|
38
60
|
|
|
39
|
-
|
|
40
|
-
|
|
61
|
+
```bash
|
|
62
|
+
repo workspace upgrade
|
|
63
|
+
repo ws up
|
|
64
|
+
repo tooling init eslint vitest
|
|
65
|
+
repo tg init --all
|
|
66
|
+
repo skills sync --codex
|
|
67
|
+
repo ai prompt create --name checkout
|
|
41
68
|
```
|
|
42
69
|
|
|
43
|
-
|
|
70
|
+
## 日常任务对照表
|
|
71
|
+
|
|
72
|
+
| 你想做什么 | 推荐命令 | 说明 |
|
|
73
|
+
| ---------------------- | ---------------------------- | ------------------------------------------------- |
|
|
74
|
+
| 初始化一个刚接入的仓库 | `pnpm setup` | 同步推荐的仓库元信息和基础工程化配置 |
|
|
75
|
+
| 看仓库当前状态是否健康 | `pnpm doctor` | 先排根目录、Node、脚本、配置冲突、提交链路 |
|
|
76
|
+
| 创建一个新的包或应用 | `pnpm new` | 支持交互式选择,也支持 `--template` |
|
|
77
|
+
| 提交前做本地校验 | `pnpm check` | 默认对齐推荐 pre-commit / pre-push 逻辑 |
|
|
78
|
+
| 同步模板最新标准资产 | `pnpm exec repo upgrade` | 适合模板升级、老仓库补齐 |
|
|
79
|
+
| 清理演示仓库或非必要包 | `pnpm exec repo clean --yes` | 零安装也可以用 `pnpm dlx repo@latest clean --yes` |
|
|
80
|
+
|
|
81
|
+
## `doctor`、`check`、`upgrade` 的边界
|
|
82
|
+
|
|
83
|
+
这是最容易混淆的三个命令。
|
|
84
|
+
|
|
85
|
+
### `doctor`
|
|
86
|
+
|
|
87
|
+
偏“仓库体检”。
|
|
88
|
+
|
|
89
|
+
它不关心你当前改了什么代码,而是关心:
|
|
90
|
+
|
|
91
|
+
- 这个仓库是不是完整
|
|
92
|
+
- 当前目录是不是根目录
|
|
93
|
+
- 当前机器的 Node 版本能不能跑
|
|
94
|
+
- 命令入口和配置文件是不是一致
|
|
95
|
+
|
|
96
|
+
### `check`
|
|
44
97
|
|
|
45
|
-
|
|
46
|
-
| -------------- | ------------ | -------------- |
|
|
47
|
-
| 传统脚本 | 120s | 120s |
|
|
48
|
-
| Turbo 本地缓存 | 120s | **≈5s** |
|
|
49
|
-
| Turbo 远程缓存 | 120s | **≈2s** |
|
|
98
|
+
偏“提交前校验”。
|
|
50
99
|
|
|
51
|
-
|
|
100
|
+
它更像一个人工触发的推荐检查入口,适合:
|
|
52
101
|
|
|
53
|
-
|
|
102
|
+
- 提交前自查
|
|
103
|
+
- 怀疑 lint / typecheck / hooks 有问题时快速复现
|
|
104
|
+
- 用 `repo check --dry-run`、`repo check --json --out reports/check-plan.json` 或 `repo check --markdown --redact --out reports/check-plan.md` 先确认校验路由
|
|
54
105
|
|
|
55
|
-
|
|
106
|
+
### `upgrade`
|
|
107
|
+
|
|
108
|
+
偏“模板资产同步”。
|
|
109
|
+
|
|
110
|
+
它解决的是:
|
|
111
|
+
|
|
112
|
+
- 模板最新默认脚本要不要补进来
|
|
113
|
+
- 工作流、配置文件、GitHub 资产要不要同步
|
|
114
|
+
- 存量仓库要不要追上现在的标准
|
|
115
|
+
|
|
116
|
+
## 配置推荐
|
|
117
|
+
|
|
118
|
+
推荐只保留一个文件:
|
|
56
119
|
|
|
57
120
|
```ts
|
|
58
|
-
|
|
121
|
+
// repoctl.config.ts
|
|
122
|
+
import { defineMonorepoConfig } from 'repoctl'
|
|
59
123
|
|
|
60
124
|
export default defineMonorepoConfig({
|
|
61
125
|
commands: {
|
|
62
126
|
create: {
|
|
63
|
-
|
|
64
|
-
templateMap: {
|
|
65
|
-
'cloud-function': {
|
|
66
|
-
source: 'functions/cloud',
|
|
67
|
-
target: 'apps/functions/cloud',
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
choices: [
|
|
71
|
-
{ value: 'cli', name: 'CLI 模板' },
|
|
72
|
-
{ value: 'cloud-function', name: '云函数模板' },
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
sync: {
|
|
76
|
-
command: 'cnpm sync {name}',
|
|
77
|
-
concurrency: 4,
|
|
127
|
+
defaultTemplate: 'tsdown',
|
|
78
128
|
},
|
|
79
129
|
clean: {
|
|
80
130
|
autoConfirm: true,
|
|
81
|
-
|
|
131
|
+
},
|
|
132
|
+
upgrade: {
|
|
133
|
+
skipOverwrite: true,
|
|
82
134
|
},
|
|
83
135
|
},
|
|
84
136
|
})
|
|
85
137
|
```
|
|
86
138
|
|
|
87
|
-
|
|
139
|
+
说明:
|
|
88
140
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
| `clean` | `autoConfirm` / `ignorePackages` / `includePrivate` / `pinnedVersion` | 控制交互、过滤包、锁定依赖版本 |
|
|
93
|
-
| `sync` | `concurrency` / `command` / `packages` | 定义同步命令与并发度 |
|
|
94
|
-
| `upgrade` | `targets` / `mergeTargets` / `scripts` / `skipChangesetMarkdown` / `skipOverwrite` | 改写配置同步策略 |
|
|
95
|
-
| `init` | `skipReadme` / `skipPkgJson` / `skipChangeset` | 按需跳过初始化步骤 |
|
|
96
|
-
| `mirror` | `env` | 注入镜像环境变量 |
|
|
97
|
-
| `ai` | `output` / `format` / `force` / `baseDir` / `tasksFile` | 预设 Agentic 模板输出目录、格式与批量任务,默认写入 `agentic/prompts/<timestamp>/prompt.md` |
|
|
141
|
+
- 优先使用 `repoctl.config.ts`
|
|
142
|
+
- `monorepo.config.ts` 继续兼容
|
|
143
|
+
- 两者不能同时存在
|
|
98
144
|
|
|
99
|
-
|
|
145
|
+
如果同时存在,现在 CLI 会直接报错,`repo doctor` 也会把它判成阻塞项。
|
|
100
146
|
|
|
101
|
-
|
|
147
|
+
## `new` 的推荐用法
|
|
148
|
+
|
|
149
|
+
### 交互式
|
|
102
150
|
|
|
103
151
|
```bash
|
|
104
|
-
|
|
105
|
-
|
|
152
|
+
pnpm new
|
|
153
|
+
```
|
|
106
154
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
155
|
+
适合第一次使用模板、想先看看有哪些模板可选。
|
|
156
|
+
|
|
157
|
+
### 直接指定模板
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
pnpm exec repo new docs --template vitepress
|
|
161
|
+
pnpm exec repo new sdk --template tsdown
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
适合你已经明确知道要创建什么。
|
|
165
|
+
|
|
166
|
+
### 固化团队默认模板
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { defineMonorepoConfig } from 'repoctl'
|
|
170
|
+
|
|
171
|
+
export default defineMonorepoConfig({
|
|
172
|
+
commands: {
|
|
173
|
+
create: {
|
|
174
|
+
defaultTemplate: 'tsdown',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
})
|
|
111
178
|
```
|
|
112
179
|
|
|
113
|
-
|
|
180
|
+
设置后:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
pnpm exec repo new utils
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
会直接按默认模板生成,不再额外询问模板类型。
|
|
187
|
+
|
|
188
|
+
## 默认提交链路
|
|
189
|
+
|
|
190
|
+
如果你保留模板默认生成的 `.husky` 与 `lint-staged.config.js`,通常会得到这条链路:
|
|
191
|
+
|
|
192
|
+
| 阶段 | 默认行为 |
|
|
193
|
+
| ------------ | ----------------------------------------------------------------------- |
|
|
194
|
+
| `pre-commit` | 聚焦 staged 文件运行 `stylelint`、`eslint`、workspace `typecheck` |
|
|
195
|
+
| `pre-push` | 运行整仓 `lint`、`typecheck`,再补跑受影响包的 `build` / `test` / `tsd` |
|
|
196
|
+
|
|
197
|
+
这也是为什么:
|
|
198
|
+
|
|
199
|
+
- `pnpm doctor` 会检查 Husky 与 lint-staged 是否同时存在
|
|
200
|
+
- `pnpm check` 会成为最自然的人工入口
|
|
201
|
+
|
|
202
|
+
## 依赖与构建建议
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
pnpm install
|
|
206
|
+
pnpm up -rLi
|
|
207
|
+
pnpm build
|
|
208
|
+
pnpm test
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- `pnpm install`:统一安装 workspace 依赖
|
|
212
|
+
- `pnpm up -rLi`:交互式升级依赖
|
|
213
|
+
- `pnpm build` / `pnpm test`:让 Turborepo 帮你做任务编排与缓存
|
|
214
|
+
|
|
215
|
+
## 工具层 API 什么时候用
|
|
216
|
+
|
|
217
|
+
如果你只是要使用默认 CLI,不需要直接碰 `@icebreakers/monorepo/tooling`。
|
|
114
218
|
|
|
115
|
-
|
|
219
|
+
只有下面两种情况建议直接使用:
|
|
116
220
|
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
- **CI 时间长**:结合 `pnpm fetch` 预拉取依赖,配合 `turbo` 缓存,通常能把 pipeline 压缩到原来的 1/3。
|
|
120
|
-
- **命令行为差异**:将所有自定义行为写入 `monorepo.config.ts`,避免脚本散落多处难以维护。
|
|
221
|
+
- 你要在仓库里手写 tooling wrapper 配置
|
|
222
|
+
- 你在维护这套 CLI / 模板本身
|
|
121
223
|
|
|
122
|
-
|
|
224
|
+
其余大多数团队,停留在 `repoctl.config.ts` 这一层就够了。
|
|
123
225
|
|
|
124
|
-
|
|
125
|
-
- [changesets 发包指南](./publish.md)
|
|
126
|
-
- [工具篇:pnpm、Turborepo、Changesets 等](../tools/turborepo.md)
|
|
127
|
-
- [常见思考与实践](../thinking.md)
|
|
226
|
+
## 继续阅读
|
|
128
227
|
|
|
129
|
-
|
|
228
|
+
- [命令速查](./commands.md)
|
|
229
|
+
- [排障指南](./troubleshooting.md)
|
|
230
|
+
- [发包与变更日志](./publish.md)
|