@icebreakers/monorepo-templates 1.3.0 → 1.3.2
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 +6 -0
- package/README.zh-CN.md +6 -0
- package/assets/.github/workflows/ci.yml +11 -0
- package/assets/.github/workflows/release-intent-check.yml +57 -0
- package/assets/CONTRIBUTING.md +3 -1
- package/assets/package.json +57 -14
- package/assets/pnpm-workspace.yaml +13 -0
- package/assets/repoctl.config.ts +6 -1
- package/assets/turbo.json +16 -0
- package/package.json +4 -4
- package/templates/client/eslint.config.js +1 -1
- package/templates/client/package.json +13 -13
- package/templates/client/worker-configuration.d.ts +763 -217
- package/templates/server/package.json +3 -3
- package/templates/server/worker-configuration.d.ts +763 -217
- package/templates/vitepress/.vitepress/config.ts +17 -7
- package/templates/vitepress/.vitepress/home/content.ts +64 -156
- package/templates/vitepress/.vitepress/home/types.ts +18 -34
- package/templates/vitepress/.vitepress/navigation/routes.ts +89 -81
- package/templates/vitepress/.vitepress/seo.ts +16 -2
- package/templates/vitepress/.vitepress/theme/Layout.vue +27 -0
- package/templates/vitepress/.vitepress/theme/components/HomePage.vue +66 -88
- package/templates/vitepress/.vitepress/theme/home/foundation.css +161 -104
- package/templates/vitepress/.vitepress/theme/home/responsive.css +113 -20
- package/templates/vitepress/.vitepress/theme/home/sections.css +179 -100
- package/templates/vitepress/.vitepress/theme/index.ts +2 -0
- package/templates/vitepress/learn/index.md +18 -0
- package/templates/vitepress/{monorepo → learn/monorepo}/commands.md +1 -1
- package/templates/vitepress/{monorepo → learn/monorepo}/index.md +3 -3
- package/templates/vitepress/{monorepo → learn/monorepo}/templates.md +1 -1
- package/templates/vitepress/{why/what-is-npm-package.md → learn/packages/index.md} +1 -1
- package/templates/vitepress/{why → learn/packages}/modern/index.md +2 -2
- package/templates/vitepress/{why → learn/packages}/modern/typescript.md +1 -1
- package/templates/vitepress/{why/index.md → learn/packages/modern-overview.md} +1 -1
- package/templates/vitepress/{why/publish-basic-npm-package.md → learn/packages/publish.md} +1 -1
- package/templates/vitepress/{why/how-to-reuse-js-code.md → learn/packages/reuse-javascript.md} +2 -2
- package/templates/vitepress/{why/js-keywords.md → learn/packages/runtime-globals.md} +2 -2
- package/templates/vitepress/{repoctl/index.md → learn/repoctl-model.md} +8 -8
- package/templates/vitepress/{tools → learn/tools}/changeset.md +3 -3
- package/templates/vitepress/{tools → learn/tools}/husky.md +2 -2
- package/templates/vitepress/{tools → learn/tools}/lint-staged.md +2 -2
- package/templates/vitepress/{tools → learn/tools}/llms-txt.md +1 -1
- package/templates/vitepress/{tools → learn/tools}/pnpm.md +2 -2
- package/templates/vitepress/{tools → learn/tools}/renovate.md +2 -2
- package/templates/vitepress/{tools → learn/tools}/turborepo.md +2 -2
- package/templates/vitepress/package.json +7 -7
- package/templates/vitepress/public/brand/apple-touch-icon.png +0 -0
- package/templates/vitepress/public/brand/favicon.ico +0 -0
- package/templates/vitepress/public/brand/repoctl-lockup-dark.svg +6 -0
- package/templates/vitepress/public/brand/repoctl-lockup.svg +20 -0
- package/templates/vitepress/public/brand/repoctl-mark-192.png +0 -0
- package/templates/vitepress/public/brand/repoctl-mark-dark.svg +13 -0
- package/templates/vitepress/public/brand/repoctl-mark.svg +13 -0
- package/templates/vitepress/public/brand/repoctl-social-en.png +0 -0
- package/templates/vitepress/public/brand/repoctl-social-en.webp +0 -0
- package/templates/vitepress/public/brand/repoctl-social-zh.png +0 -0
- package/templates/vitepress/public/brand/repoctl-social-zh.webp +0 -0
- package/templates/vitepress/public/favicon.ico +0 -0
- package/templates/vitepress/public/logo.jpg +0 -0
- package/templates/vitepress/{repoctl → reference}/commands.md +2 -2
- package/templates/vitepress/reference/index.md +15 -0
- package/templates/vitepress/reference/output.md +37 -0
- package/templates/vitepress/{repoctl → reference}/templates.md +2 -2
- package/templates/vitepress/scripts/check-locales.ts +35 -1
- package/templates/vitepress/start/choose-next.md +14 -0
- package/templates/vitepress/start/first-run.md +39 -0
- package/templates/vitepress/start/index.md +26 -0
- package/templates/vitepress/{repoctl/getting-started.md → start/install.md} +5 -5
- package/templates/vitepress/{repoctl → tasks}/adopt-existing.md +30 -4
- package/templates/vitepress/{repoctl → tasks}/checks.md +27 -1
- package/templates/vitepress/{repoctl/workflows.md → tasks/ci.md} +30 -4
- package/templates/vitepress/tasks/create-project.md +37 -0
- package/templates/vitepress/{repoctl/scenarios.md → tasks/index.md} +8 -8
- package/templates/vitepress/tasks/release.md +31 -0
- package/templates/vitepress/{repoctl → tasks}/reports.md +25 -0
- package/templates/vitepress/{repoctl → tasks}/troubleshooting.md +30 -4
- package/templates/vitepress/zh/ai/llms-txt.md +6 -6
- package/templates/vitepress/zh/learn/index.md +18 -0
- package/templates/vitepress/zh/{monorepo → learn/monorepo}/commands.md +3 -3
- package/templates/vitepress/zh/{monorepo → learn/monorepo}/manage.md +4 -4
- package/templates/vitepress/zh/{monorepo → learn/monorepo}/templates.md +2 -2
- package/templates/vitepress/zh/{monorepo → learn/monorepo}/troubleshooting.md +2 -2
- package/templates/vitepress/zh/{why → learn/packages}/modern/index.md +1 -1
- package/templates/vitepress/zh/{why/index.md → learn/packages/modern-overview.md} +2 -2
- package/templates/vitepress/zh/{repoctl/index.md → learn/repoctl-model.md} +19 -19
- package/templates/vitepress/zh/{tools → learn/tools}/husky.md +1 -1
- package/templates/vitepress/zh/{tools → learn/tools}/lint-staged.md +1 -1
- package/templates/vitepress/zh/{tools → learn/tools}/llms-txt.md +1 -1
- package/templates/vitepress/zh/{tools → learn/tools}/pnpm.md +1 -1
- package/templates/vitepress/zh/{tools → learn/tools}/turborepo.md +11 -11
- package/templates/vitepress/zh/{repoctl → reference}/commands.md +4 -4
- package/templates/vitepress/zh/{repoctl → reference}/config.md +1 -1
- package/templates/vitepress/zh/reference/index.md +15 -0
- package/templates/vitepress/zh/reference/output.md +37 -0
- package/templates/vitepress/zh/{repoctl → reference}/templates.md +4 -4
- package/templates/vitepress/zh/start/choose-next.md +14 -0
- package/templates/vitepress/zh/{repoctl/doctor.md → start/diagnose.md} +1 -1
- package/templates/vitepress/zh/start/first-run.md +39 -0
- package/templates/vitepress/zh/start/index.md +26 -0
- package/templates/vitepress/zh/{repoctl/getting-started.md → start/install.md} +5 -5
- package/templates/vitepress/zh/{repoctl → tasks}/adopt-existing.md +30 -4
- package/templates/vitepress/zh/{repoctl → tasks}/checks.md +27 -1
- package/templates/vitepress/zh/{repoctl/workflows.md → tasks/ci.md} +38 -12
- package/templates/vitepress/zh/tasks/create-project.md +37 -0
- package/templates/vitepress/zh/{repoctl/scenarios.md → tasks/index.md} +8 -8
- package/templates/vitepress/zh/tasks/release.md +31 -0
- package/templates/vitepress/zh/{repoctl → tasks}/reports.md +25 -0
- package/templates/vitepress/zh/{repoctl → tasks}/troubleshooting.md +39 -13
- package/templates/vue-lib/package.json +5 -5
- package/templates/vitepress/getting-started.md +0 -11
- package/templates/vitepress/knowledge/index.md +0 -26
- package/templates/vitepress/thinking.md +0 -22
- package/templates/vitepress/zh/getting-started.md +0 -40
- package/templates/vitepress/zh/knowledge/index.md +0 -50
- package/templates/vitepress/zh/thinking.md +0 -91
- /package/templates/vitepress/{monorepo → learn/monorepo}/manage.md +0 -0
- /package/templates/vitepress/{monorepo → learn/monorepo}/publish.md +0 -0
- /package/templates/vitepress/{monorepo → learn/monorepo}/troubleshooting.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/assets/npm-dt.svg +0 -0
- /package/templates/vitepress/{why → learn/packages}/assets/npm-ts.svg +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/0.npm-basic-package/index.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/0.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.cjs +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.d.ts +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/README.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package-lock.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/rename-ext.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/src/index.ts +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.cjs.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.esm.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/README.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package-lock.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/src/index.ts +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsconfig.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsdown.config.ts +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/cjs.cjs +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/esm.mjs +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/index.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/package-lock.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/cjs.cjs +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/createRequire.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/esm.mjs +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/index.js +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/package-lock.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/package.json +0 -0
- /package/templates/vitepress/{why → learn/packages}/modern/bundlers.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/modern/dts.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/modern/esm-vs-cjs.md +0 -0
- /package/templates/vitepress/{why → learn/packages}/modern/package-entry-points.md +0 -0
- /package/templates/vitepress/{why/js-cjs-mjs.md → learn/packages/module-extensions.md} +0 -0
- /package/templates/vitepress/{tools → learn/tools}/index.md +0 -0
- /package/templates/vitepress/{repoctl → reference}/aliases.md +0 -0
- /package/templates/vitepress/{repoctl → reference}/config.md +0 -0
- /package/templates/vitepress/{repoctl → reference}/execution-model.md +0 -0
- /package/templates/vitepress/{repoctl → reference}/template-assets.md +0 -0
- /package/templates/vitepress/{repoctl/doctor.md → start/diagnose.md} +0 -0
- /package/templates/vitepress/zh/{monorepo → learn/monorepo}/index.md +0 -0
- /package/templates/vitepress/zh/{monorepo → learn/monorepo}/publish.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/assets/npm-dt.svg +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/assets/npm-ts.svg +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/0.npm-basic-package/index.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/0.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.cjs +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.d.ts +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/README.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/package-lock.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/rename-ext.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/src/index.ts +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.cjs.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.esm.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/README.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/package-lock.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/package.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/src/index.ts +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/tsconfig.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/tsdown.config.ts +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/cjs.cjs +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/esm.mjs +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/index.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/package-lock.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/package.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/cjs.cjs +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/createRequire.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/esm.mjs +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/index.js +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/package-lock.json +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/package.json +0 -0
- /package/templates/vitepress/zh/{why/what-is-npm-package.md → learn/packages/index.md} +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/modern/bundlers.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/modern/dts.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/modern/esm-vs-cjs.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/modern/package-entry-points.md +0 -0
- /package/templates/vitepress/zh/{why → learn/packages}/modern/typescript.md +0 -0
- /package/templates/vitepress/zh/{why/js-cjs-mjs.md → learn/packages/module-extensions.md} +0 -0
- /package/templates/vitepress/zh/{why/publish-basic-npm-package.md → learn/packages/publish.md} +0 -0
- /package/templates/vitepress/zh/{why/how-to-reuse-js-code.md → learn/packages/reuse-javascript.md} +0 -0
- /package/templates/vitepress/zh/{why/js-keywords.md → learn/packages/runtime-globals.md} +0 -0
- /package/templates/vitepress/zh/{tools → learn/tools}/changeset.md +0 -0
- /package/templates/vitepress/zh/{tools → learn/tools}/index.md +0 -0
- /package/templates/vitepress/zh/{tools → learn/tools}/renovate.md +0 -0
- /package/templates/vitepress/zh/{repoctl → reference}/aliases.md +0 -0
- /package/templates/vitepress/zh/{repoctl → reference}/execution-model.md +0 -0
- /package/templates/vitepress/zh/{repoctl → reference}/template-assets.md +0 -0
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 把校验加入 CI
|
|
2
|
+
|
|
3
|
+
## 适用场景
|
|
4
|
+
|
|
5
|
+
当本地命令已经稳定,需要在每个 pull request 或分支上执行同一套仓库策略时,使用这个任务。
|
|
6
|
+
|
|
7
|
+
## 前置条件
|
|
8
|
+
|
|
9
|
+
- 已经生成通过检查的 `repo check --dry-run` 计划。
|
|
10
|
+
- CI runner 具备 Node.js、pnpm 和仓库锁文件。
|
|
11
|
+
- 发布或发版 job 使用非交互凭据。
|
|
12
|
+
|
|
13
|
+
## 最小命令
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
repo check --full --json --out reports/check-plan.json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 预期输出
|
|
20
|
+
|
|
21
|
+
CI 会得到稳定的计划,并可以把 JSON 或 Markdown 报告作为 artifact 上传。同一条命令也可以在本地执行。
|
|
22
|
+
|
|
23
|
+
## 常见分支
|
|
24
|
+
|
|
25
|
+
- pull request 需要快速门禁:使用 `repo check --staged` 或仓库的 pre-commit 模式。
|
|
26
|
+
- main 分支需要完整门禁:使用 `repo check --full`。
|
|
27
|
+
- 发布 job 需要版本计划:发布前执行 `repo release --dry-run`。
|
|
2
28
|
|
|
3
29
|
repoctl 的命令可以分成两类:给人用的日常入口,以及给 CI、脚本、编辑器用的可保存输出。
|
|
4
30
|
|
|
@@ -89,13 +115,13 @@ repo ws ls --json --out reports/workspaces.json
|
|
|
89
115
|
|
|
90
116
|
## 推荐流水线拆分
|
|
91
117
|
|
|
92
|
-
| 阶段 | 命令 | 失败后先看
|
|
93
|
-
| ---- | --------------------------------------------------------------- |
|
|
94
|
-
| 安装 | `pnpm install --frozen-lockfile` | lockfile、Node、pnpm 版本
|
|
95
|
-
| 诊断 | `repo doctor --strict` | [doctor 诊断](
|
|
96
|
-
| 计划 | `repo check --full --json --out reports/check-plan.json` | [报告与自动化输出](
|
|
97
|
-
| 执行 | `repo check --full` | 失败的 root script 或 workspace 任务
|
|
98
|
-
| 留证 | `repo env support --markdown --redact --out reports/support.md` | CI artifact
|
|
118
|
+
| 阶段 | 命令 | 失败后先看 |
|
|
119
|
+
| ---- | --------------------------------------------------------------- | ------------------------------------- |
|
|
120
|
+
| 安装 | `pnpm install --frozen-lockfile` | lockfile、Node、pnpm 版本 |
|
|
121
|
+
| 诊断 | `repo doctor --strict` | [doctor 诊断](/zh/start/diagnose) |
|
|
122
|
+
| 计划 | `repo check --full --json --out reports/check-plan.json` | [报告与自动化输出](/zh/tasks/reports) |
|
|
123
|
+
| 执行 | `repo check --full` | 失败的 root script 或 workspace 任务 |
|
|
124
|
+
| 留证 | `repo env support --markdown --redact --out reports/support.md` | CI artifact |
|
|
99
125
|
|
|
100
126
|
早期项目可以把计划和执行合并。成熟项目建议保留 `reports/`,方便失败时复盘实际执行路径。
|
|
101
127
|
|
|
@@ -147,7 +173,7 @@ pnpm --filter @icebreakers/website exec wrangler rollback <VERSION_ID>
|
|
|
147
173
|
|
|
148
174
|
## 下一步
|
|
149
175
|
|
|
150
|
-
- 查所有参数:[命令速查](
|
|
151
|
-
-
|
|
152
|
-
- 生成排障包:[报告与自动化输出](
|
|
153
|
-
- 看短命令:[命令别名](
|
|
176
|
+
- 查所有参数:[命令速查](/zh/reference/commands)
|
|
177
|
+
- 理解本地校验:[运行校验](/zh/tasks/checks)
|
|
178
|
+
- 生成排障包:[报告与自动化输出](/zh/tasks/reports)
|
|
179
|
+
- 看短命令:[命令别名](/zh/reference/aliases)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# 创建包或应用
|
|
2
|
+
|
|
3
|
+
当 workspace 已经准备好,需要创建新的包、应用、服务、CLI 或文档站时,使用这个任务页。
|
|
4
|
+
|
|
5
|
+
## 前置条件
|
|
6
|
+
|
|
7
|
+
- 在 workspace 根目录运行过 `repo doctor`。
|
|
8
|
+
- 确认包名和目标目录。
|
|
9
|
+
- 使用 `repo templates` 查看可用模板键。
|
|
10
|
+
|
|
11
|
+
## 最小命令
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
repo new <name> --template <template>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
例如:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
repo new shared-config --template package
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
只想查看文件计划时,加入 `--dry-run`,不会写入文件。
|
|
24
|
+
|
|
25
|
+
## 预期结果
|
|
26
|
+
|
|
27
|
+
repoctl 会输出选中的模板、目标目录和将要创建的文件。确认后,新项目加入 workspace,包元数据可以直接进入仓库校验。
|
|
28
|
+
|
|
29
|
+
## 常见分支
|
|
30
|
+
|
|
31
|
+
- 模板键不存在:先运行 `repo templates`,选择已安装的键。
|
|
32
|
+
- 目标目录已存在:换一个名称,或检查现有项目后再决定是否覆盖。
|
|
33
|
+
- 需要自定义共享文件:先创建项目,再通过[受管模板资产](/zh/reference/template-assets)同步公共文件。
|
|
34
|
+
|
|
35
|
+
## 下一步
|
|
36
|
+
|
|
37
|
+
运行[校验](/zh/tasks/checks),再把新项目加入 [CI 工作流](/zh/tasks/ci)。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 任务索引
|
|
2
2
|
|
|
3
3
|
如果你不确定该用哪个 repoctl 命令,先从这一页开始。
|
|
4
4
|
|
|
@@ -17,7 +17,7 @@ pnpm exec repo init --yes
|
|
|
17
17
|
pnpm exec repo doctor
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
继续看:[
|
|
20
|
+
继续看:[安装并初始化](/zh/start/install)。
|
|
21
21
|
|
|
22
22
|
## 我要把 repoctl 接入旧仓库
|
|
23
23
|
|
|
@@ -29,7 +29,7 @@ pnpm exec repo upgrade --no-overwrite
|
|
|
29
29
|
pnpm exec repo doctor --markdown --redact --out reports/doctor-after.md
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
继续看:[
|
|
32
|
+
继续看:[接入已有 workspace](/zh/tasks/adopt-existing)。
|
|
33
33
|
|
|
34
34
|
## 我要创建新包或应用
|
|
35
35
|
|
|
@@ -45,7 +45,7 @@ pnpm exec repo new docs --template vitepress --dry-run
|
|
|
45
45
|
pnpm run repo:new -- sdk --template tsdown
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
继续看:[模板与创建](
|
|
48
|
+
继续看:[模板与创建](/zh/reference/templates)。
|
|
49
49
|
|
|
50
50
|
## 我要提交前自查
|
|
51
51
|
|
|
@@ -62,7 +62,7 @@ pnpm exec repo check --json --out reports/check-plan.json
|
|
|
62
62
|
pnpm exec repo check --markdown --redact --out reports/check-plan.md
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
继续看:[
|
|
65
|
+
继续看:[把校验加入 CI](/zh/tasks/ci)。
|
|
66
66
|
|
|
67
67
|
## 我要调试 CI 或同事机器问题
|
|
68
68
|
|
|
@@ -72,7 +72,7 @@ pnpm exec repo env support --markdown --redact --out reports/support.md
|
|
|
72
72
|
pnpm exec repo env snapshot --json --out reports/snapshot.json
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
继续看:[
|
|
75
|
+
继续看:[排障](/zh/tasks/troubleshooting)。
|
|
76
76
|
|
|
77
77
|
## 我要同步模板标准资产
|
|
78
78
|
|
|
@@ -105,7 +105,7 @@ pnpm exec repo config inspect
|
|
|
105
105
|
pnpm exec repo cfg i --json --out reports/config.json
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
继续看:[配置文件](
|
|
108
|
+
继续看:[配置文件](/zh/reference/config)。
|
|
109
109
|
|
|
110
110
|
## 我要写更短的命令
|
|
111
111
|
|
|
@@ -116,4 +116,4 @@ repo e support --markdown --redact
|
|
|
116
116
|
repo cfg i
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
-
继续看:[命令别名](
|
|
119
|
+
继续看:[命令别名](/zh/reference/aliases)。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 发布包
|
|
2
|
+
|
|
3
|
+
当改动准备好更新版本并发布时,使用这个任务页。任何写入 registry 的操作都应该先经过可审查的发布计划。
|
|
4
|
+
|
|
5
|
+
## 前置条件
|
|
6
|
+
|
|
7
|
+
- `repo doctor` 报告包管理器和发布配置有效。
|
|
8
|
+
- 工作区除本次改动外保持干净。
|
|
9
|
+
- 每个可发布改动都有 changeset 或仓库约定的 intent 文件。
|
|
10
|
+
|
|
11
|
+
## 最小命令
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
repo release --dry-run
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
检查包组、版本、变更日志和发布命令。计划确认后,再去掉 `--dry-run` 执行发布。
|
|
18
|
+
|
|
19
|
+
## 预期结果
|
|
20
|
+
|
|
21
|
+
发布报告会列出将要变化的包、版本决策和每个子进程。发布成功后,还会执行配置好的 post-publish hooks。
|
|
22
|
+
|
|
23
|
+
## 常见分支
|
|
24
|
+
|
|
25
|
+
- 缺少 intent:添加 changeset 后重新生成计划。
|
|
26
|
+
- 固定版本组不一致:先检查包之间的关系,再修改版本。
|
|
27
|
+
- registry 认证失败:刷新本地 token 后重试,不要提交凭据。
|
|
28
|
+
|
|
29
|
+
## 下一步
|
|
30
|
+
|
|
31
|
+
阅读[发包与变更日志](/zh/learn/monorepo/publish),再查看[报告与输出](/zh/tasks/reports)了解 CI 产物。
|
|
@@ -4,6 +4,31 @@ description: 说明 repoctl 的 JSON、Markdown、out、redact、env info、env
|
|
|
4
4
|
|
|
5
5
|
# 报告与自动化输出
|
|
6
6
|
|
|
7
|
+
## 适用场景
|
|
8
|
+
|
|
9
|
+
当成员、CI 或支持请求需要一份可保存的诊断或计划记录时,使用这个任务。
|
|
10
|
+
|
|
11
|
+
## 前置条件
|
|
12
|
+
|
|
13
|
+
- 选择一个被忽略或会作为 CI artifact 上传的 `reports/` 目录。
|
|
14
|
+
- 分享环境信息前使用 `--redact`。
|
|
15
|
+
|
|
16
|
+
## 最小命令
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
repo env support --markdown --redact --out reports/support.md
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 预期输出
|
|
23
|
+
|
|
24
|
+
输出文件包含稳定的标题和命令结果,可以附在 pull request 或 issue 中。
|
|
25
|
+
|
|
26
|
+
## 常见分支
|
|
27
|
+
|
|
28
|
+
- 其他工具需要读取结果:使用带 `--json` 的 JSON 输出。
|
|
29
|
+
- 只想查看计划:把 `--dry-run` 和目标格式一起使用。
|
|
30
|
+
- 报告中出现本地路径或 token:加上 `--redact` 重新生成。
|
|
31
|
+
|
|
7
32
|
repoctl 的报告能力用于把本地上下文变成可保存、可脱敏、可给脚本读取的文件。它适合 CI artifact、issue 模板、编辑器集成和跨机器排障。
|
|
8
33
|
|
|
9
34
|
## 1. 通用输出参数
|
|
@@ -1,4 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 排障
|
|
2
|
+
|
|
3
|
+
## 适用场景
|
|
4
|
+
|
|
5
|
+
初始化、校验、模板或自动化出现意外结果时,使用这个任务。
|
|
6
|
+
|
|
7
|
+
## 前置条件
|
|
8
|
+
|
|
9
|
+
- 在仓库根目录执行命令。
|
|
10
|
+
- 保留原始错误和仓库 revision。
|
|
11
|
+
- 分享命令输出前移除敏感值。
|
|
12
|
+
|
|
13
|
+
## 最小命令
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
repo doctor --markdown --redact --out reports/doctor.md
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 预期输出
|
|
20
|
+
|
|
21
|
+
报告会指出仓库根目录、包管理器、workspace 配置、工具链和第一个失败的检查。
|
|
22
|
+
|
|
23
|
+
## 常见分支
|
|
24
|
+
|
|
25
|
+
- 命令从子目录执行:切换到 workspace 根目录。
|
|
26
|
+
- 配置文件和受管资产冲突:先查看计划,再决定是否覆盖。
|
|
27
|
+
- 模板键不存在:使用 `repo templates` 列出模板。
|
|
2
28
|
|
|
3
29
|
repoctl 的排障重点不是让你猜错在哪里,而是尽量输出可以复现、可以保存、可以发给同事的报告。
|
|
4
30
|
|
|
@@ -51,13 +77,13 @@ repo env paths --markdown --redact --out reports/paths.md
|
|
|
51
77
|
|
|
52
78
|
## 先判断问题类型
|
|
53
79
|
|
|
54
|
-
| 现象 | 优先命令 | 继续阅读
|
|
55
|
-
| ------------------------------ | ----------------------------------------- |
|
|
56
|
-
| 不确定当前目录是不是仓库根目录 | `repo doctor` | [doctor 诊断](
|
|
57
|
-
| 不知道 `repo check` 会跑什么 | `repo check --dry-run` | [
|
|
58
|
-
| CI 失败但日志不完整 | `repo env support --markdown --redact` | [报告与自动化输出](
|
|
59
|
-
| 模板创建结果不符合预期 | `repo new <name> --template <key> --json` | [模板资产治理](
|
|
60
|
-
| 模板列表或元数据异常 | `repo templates --check` | [模板资产治理](
|
|
80
|
+
| 现象 | 优先命令 | 继续阅读 |
|
|
81
|
+
| ------------------------------ | ----------------------------------------- | --------------------------------------------- |
|
|
82
|
+
| 不确定当前目录是不是仓库根目录 | `repo doctor` | [doctor 诊断](/zh/start/diagnose) |
|
|
83
|
+
| 不知道 `repo check` 会跑什么 | `repo check --dry-run` | [运行校验](/zh/tasks/checks) |
|
|
84
|
+
| CI 失败但日志不完整 | `repo env support --markdown --redact` | [报告与自动化输出](/zh/tasks/reports) |
|
|
85
|
+
| 模板创建结果不符合预期 | `repo new <name> --template <key> --json` | [模板资产治理](/zh/reference/template-assets) |
|
|
86
|
+
| 模板列表或元数据异常 | `repo templates --check` | [模板资产治理](/zh/reference/template-assets) |
|
|
61
87
|
|
|
62
88
|
## 常见问题
|
|
63
89
|
|
|
@@ -103,8 +129,8 @@ repo check --json --out reports/check-plan.json
|
|
|
103
129
|
|
|
104
130
|
## 继续阅读
|
|
105
131
|
|
|
106
|
-
- [
|
|
107
|
-
- [命令速查](
|
|
108
|
-
- [doctor 诊断](
|
|
109
|
-
- [报告与自动化输出](
|
|
110
|
-
- [命令别名](
|
|
132
|
+
- [把校验加入 CI](/zh/tasks/ci)
|
|
133
|
+
- [命令速查](/zh/reference/commands)
|
|
134
|
+
- [doctor 诊断](/zh/start/diagnose)
|
|
135
|
+
- [报告与自动化输出](/zh/tasks/reports)
|
|
136
|
+
- [命令别名](/zh/reference/aliases)
|
|
@@ -57,12 +57,12 @@
|
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@vitejs/plugin-vue": "^6.0.8",
|
|
60
|
-
"@vue/test-utils": "^2.
|
|
60
|
+
"@vue/test-utils": "^2.5.0",
|
|
61
61
|
"@vue/tsconfig": "^0.9.1",
|
|
62
62
|
"jsdom": "^30.0.1",
|
|
63
|
-
"vite": "^8.2.
|
|
64
|
-
"vite-plugin-dts": "^5.0
|
|
65
|
-
"vue": "^3.5.
|
|
66
|
-
"vue-tsc": "^3.3.
|
|
63
|
+
"vite": "^8.2.2",
|
|
64
|
+
"vite-plugin-dts": "^5.1.0",
|
|
65
|
+
"vue": "^3.5.42",
|
|
66
|
+
"vue-tsc": "^3.3.11"
|
|
67
67
|
}
|
|
68
68
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Getting Started
|
|
2
|
-
|
|
3
|
-
The current setup guide is [repoctl Getting Started](./repoctl/getting-started.md).
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
pnpm add -D repoctl
|
|
7
|
-
pnpm exec repo init
|
|
8
|
-
pnpm exec repo doctor
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Use [Adopt Existing Repositories](./repoctl/adopt-existing.md) when introducing repoctl to an established workspace.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
outline: deep
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Knowledge Base
|
|
6
|
-
|
|
7
|
-
This section explains the engineering decisions behind repoctl rather than only listing commands.
|
|
8
|
-
|
|
9
|
-
## Monorepo Topics
|
|
10
|
-
|
|
11
|
-
- [Why Monorepo](../monorepo/index.md)
|
|
12
|
-
- [Managing A Monorepo](../monorepo/manage.md)
|
|
13
|
-
- [Publishing and Changelogs](../monorepo/publish.md)
|
|
14
|
-
- [Command Reference](../monorepo/commands.md)
|
|
15
|
-
- [Template Systems](../monorepo/templates.md)
|
|
16
|
-
- [Troubleshooting](../monorepo/troubleshooting.md)
|
|
17
|
-
|
|
18
|
-
## Modern Package Topics
|
|
19
|
-
|
|
20
|
-
- [Reusing JavaScript Code](../why/how-to-reuse-js-code.md)
|
|
21
|
-
- [JavaScript Module Extensions](../why/js-cjs-mjs.md)
|
|
22
|
-
- [What Is An npm Package?](../why/what-is-npm-package.md)
|
|
23
|
-
- [Publishing An npm Package](../why/publish-basic-npm-package.md)
|
|
24
|
-
- [Modern Package Guide](../why/modern/index.md)
|
|
25
|
-
|
|
26
|
-
Start with the repoctl guide when you need an action. Use this knowledge base when you need to understand the tradeoffs behind that action.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Project Evolution
|
|
2
|
-
|
|
3
|
-
This repository began as a reusable monorepo template. It has since evolved into repoctl: a task-first CLI for initializing, diagnosing, creating, validating, upgrading, and releasing pnpm and Turborepo monorepos.
|
|
4
|
-
|
|
5
|
-
Templates remain an important capability, but they are now private source workspaces packaged through `@icebreakers/monorepo-templates`, not the product identity or independent release units.
|
|
6
|
-
|
|
7
|
-
See the [repoctl overview](./repoctl/index.md) for the current architecture and public entrypoints.
|
|
8
|
-
|
|
9
|
-
## Documentation Deployment
|
|
10
|
-
|
|
11
|
-
The documentation is a VitePress static site deployed as a Cloudflare Worker named `repoctl-docs`. Workers Static Assets serves the generated `.vitepress/dist` directory directly, including the custom 404 page and `_redirects` compatibility rules. There is no application Worker handler because the site has no dynamic request path.
|
|
12
|
-
|
|
13
|
-
Cloudflare Workers Builds uses the repository root and runs these commands:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
pnpm --filter @icebreakers/website build
|
|
17
|
-
pnpm --filter @icebreakers/website run deploy
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Non-production branches upload preview versions with `pnpm --filter @icebreakers/website run deploy:preview`. Before a production change, `pnpm --filter @icebreakers/website run deploy:dry-run` validates the asset manifest and Wrangler configuration. A production rollback uses `wrangler rollback <VERSION_ID>` after reviewing `wrangler versions list`.
|
|
21
|
-
|
|
22
|
-
The canonical host is `https://repoctl.icebreaker.top`. The legacy `repo.icebreaker.top` and `monorepo.icebreaker.top` hosts are redirect-only entrypoints and preserve the original path and query string.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# 新手使用指南
|
|
2
|
-
|
|
3
|
-
这篇旧入口已经收敛到 repoctl 主线。新读者建议直接阅读:
|
|
4
|
-
|
|
5
|
-
- [repoctl 快速开始](./repoctl/getting-started.md)
|
|
6
|
-
- [repoctl 命令速查](./repoctl/commands.md)
|
|
7
|
-
- [repoctl 配置文件](./repoctl/config.md)
|
|
8
|
-
|
|
9
|
-
## 先这样用
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
pnpm add -D repoctl
|
|
13
|
-
pnpm exec repo init
|
|
14
|
-
pnpm exec repo doctor
|
|
15
|
-
pnpm exec repo new
|
|
16
|
-
pnpm exec repo check
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
模板生成仓库里可以使用更短的根脚本:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
pnpm run repo:init
|
|
23
|
-
pnpm doctor
|
|
24
|
-
pnpm new
|
|
25
|
-
pnpm check
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## 知识点保留
|
|
29
|
-
|
|
30
|
-
理解工具前,先理解这几个边界:
|
|
31
|
-
|
|
32
|
-
| 命令 | 解决的问题 |
|
|
33
|
-
| -------------- | ----------------------------------------------------- |
|
|
34
|
-
| `repo init` | 补齐仓库默认脚本、workspace patterns 和基础工具链入口 |
|
|
35
|
-
| `repo doctor` | 判断仓库当前是否可用,并输出可保存的诊断报告 |
|
|
36
|
-
| `repo new` | 从内置模板创建包、应用、服务、文档站或 CLI |
|
|
37
|
-
| `repo check` | 预览或执行提交前推荐校验 |
|
|
38
|
-
| `repo upgrade` | 同步模板最新标准资产 |
|
|
39
|
-
|
|
40
|
-
如果你是在学习 monorepo 的基础概念,可以继续看 [为什么往 monorepo 方向演进](./monorepo/index.md)。
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: repoctl 文档站的知识库入口,汇总 monorepo 管理、现代 npm 包和 JavaScript 模块化基础。
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# 知识库
|
|
6
|
-
|
|
7
|
-
知识库用于解释 repoctl 背后的工程背景。这里不放命令速查,而是回答为什么要这样组织仓库、包、构建和发布流程。
|
|
8
|
-
|
|
9
|
-
## 1. monorepo 主题
|
|
10
|
-
|
|
11
|
-
| 页面 | 适合解决的问题 |
|
|
12
|
-
| -------------------------------------------------- | ---------------------------------- |
|
|
13
|
-
| [为什么往 monorepo 方向演进](../monorepo/index.md) | 判断多包仓库是否值得合并管理 |
|
|
14
|
-
| [如何管理 monorepo](../monorepo/manage.md) | 理解 workspace、任务编排和依赖边界 |
|
|
15
|
-
| [发包与变更日志](../monorepo/publish.md) | 设计 pnpm intent、版本和发布链路 |
|
|
16
|
-
| [monorepo 命令参考](../monorepo/commands.md) | 查看通用 monorepo 操作命令 |
|
|
17
|
-
| [monorepo 模板体系](../monorepo/templates.md) | 理解模板如何减少重复初始化 |
|
|
18
|
-
| [monorepo 排障](../monorepo/troubleshooting.md) | 排查依赖、构建、类型和发布问题 |
|
|
19
|
-
|
|
20
|
-
## 2. 现代 npm 包主题
|
|
21
|
-
|
|
22
|
-
| 页面 | 适合解决的问题 |
|
|
23
|
-
| ------------------------------------------------------ | ---------------------------------- |
|
|
24
|
-
| [如何复用 js 代码](../why/how-to-reuse-js-code.md) | 从复制文件演进到发布包 |
|
|
25
|
-
| [什么是 npm 包](../why/what-is-npm-package.md) | 理解 package.json、入口和安装方式 |
|
|
26
|
-
| [如何发布 npm 包](../why/publish-basic-npm-package.md) | 走通最小 npm 发布流程 |
|
|
27
|
-
| [改进并发布现代 npm 包](../why/index.md) | 把普通包升级成更规范的现代包 |
|
|
28
|
-
| [现代包指南](../why/modern/index.md) | 汇总类型、入口、模块格式和构建工具 |
|
|
29
|
-
|
|
30
|
-
## 3. 阅读顺序
|
|
31
|
-
|
|
32
|
-
如果你第一次接触 monorepo,建议按下面顺序阅读:
|
|
33
|
-
|
|
34
|
-
```txt
|
|
35
|
-
为什么 monorepo
|
|
36
|
-
-> 如何管理 monorepo
|
|
37
|
-
-> 什么是 npm 包
|
|
38
|
-
-> 现代包指南
|
|
39
|
-
-> 发包与变更日志
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
如果你已经在维护仓库,可以直接从具体问题进入:
|
|
43
|
-
|
|
44
|
-
| 你遇到的问题 | 建议入口 |
|
|
45
|
-
| ----------------------------- | ----------------------------------------------- |
|
|
46
|
-
| workspace 包互相引用不清楚 | [如何管理 monorepo](../monorepo/manage.md) |
|
|
47
|
-
| 不确定 CJS、ESM、types 怎么配 | [现代包指南](../why/modern/index.md) |
|
|
48
|
-
| 发布后使用方拿不到类型 | [类型声明](../why/modern/dts.md) |
|
|
49
|
-
| 包入口太多、导入路径混乱 | [包入口](../why/modern/package-entry-points.md) |
|
|
50
|
-
| CI 和发版流程容易漂移 | [发包与变更日志](../monorepo/publish.md) |
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# 我对 monorepo 的一些思考
|
|
2
|
-
|
|
3
|
-
## 前言
|
|
4
|
-
|
|
5
|
-
最近在自己的新项目中,我创建并使用了 [monorepo-template](https://github.com/sonofmagic/monorepo-template) 模板,并不断地做了不少改进。
|
|
6
|
-
|
|
7
|
-
在此,我想借此机会分享一下这个模板的演变过程,以及我对 `monorepo` 的一些思考。
|
|
8
|
-
|
|
9
|
-
## 它的由来
|
|
10
|
-
|
|
11
|
-
为了应对越来越多的发包场景,我创建了 [npm-lib-template](https://github.com/sonofmagic/npm-lib-template) 模板
|
|
12
|
-
|
|
13
|
-
这是一个 `git` 单仓单 `npm` 包模板,使用 `rollup` 进行打包,然后再发布到 `npm` 和 `github`
|
|
14
|
-
|
|
15
|
-
然而,在后续开发中,我发现单仓库的模式在某些场景下难以应对。
|
|
16
|
-
|
|
17
|
-
例如,当需要引用其他自己的包,进行单元测试并再次发包时,这时候往往要在多个项目之间进行来回的切换更改,管理复杂度会迅速上升。
|
|
18
|
-
|
|
19
|
-
`git submodule` 也是另外一条路子,但是我对每次都要同步 `hash` 感到深恶痛绝,遂放弃 (不过某些极其特殊场景的实现,还是只能利用这个功能)。
|
|
20
|
-
|
|
21
|
-
因此,我决定要创建一个 [monorepo 项目模板](https://github.com/sonofmagic/monorepo-template) ,以应对这些需求。
|
|
22
|
-
|
|
23
|
-
## 技术选型
|
|
24
|
-
|
|
25
|
-
### 管理工具
|
|
26
|
-
|
|
27
|
-
在 `monorepo` 的管理上,我选择了 `pnpm` 和 `turborepo` 这对组合,原因很简单:它们都非常快。
|
|
28
|
-
|
|
29
|
-
- `pnpm` 又可以节省磁盘空间,又能够链接自特定的内容寻址存储库,是为快也
|
|
30
|
-
- `turborepo` 有构建缓存,是为快也 `too`.
|
|
31
|
-
|
|
32
|
-
### 语言与打包
|
|
33
|
-
|
|
34
|
-
我选择使用纯 `TypeScript` 来编写所有类库项目,并统一使用 `tsdown` 进行打包,默认输出格式为 `cjs` 和 `esm`,并利用 `package.json` 中的 `exports` 字段进行分发。
|
|
35
|
-
|
|
36
|
-
### 直接调试
|
|
37
|
-
|
|
38
|
-
在直接调试时,我抛弃了 `dist` + `sourcemap` 的调试方式,使用了 `tsx`,它非常适合调试 `TypeScript` 编写的 `CLI` 项目。
|
|
39
|
-
|
|
40
|
-
### 测试框架
|
|
41
|
-
|
|
42
|
-
测试方面,我选择了 `vitest`。
|
|
43
|
-
|
|
44
|
-
它不仅速度快,还很好地支持 `cjs`、`esm` 和 `TypeScript`,同时也适合 `monorepo` 项目。你可以利用 `turbo` 来执行单个的 `vitest` 任务,也可以利用 `vitest.workspace` 来进行多任务测试。
|
|
45
|
-
|
|
46
|
-
最初我使用的是 `jest` + `ts-jest`,但它对多格式的混合模块的支持不够理想,最终我选择了 `vitest`。
|
|
47
|
-
|
|
48
|
-
### 代码规范与质量控制
|
|
49
|
-
|
|
50
|
-
为了保持代码质量,我使用了 `eslint` 和 `stylelint`,并基于自己的配置包 `@icebreakers/eslint-config` 和 `@icebreakers/stylelint-config` 来进行代码格式化和规范化。
|
|
51
|
-
|
|
52
|
-
我还为 `.vscode` 配置了一些推荐插件和编辑器选项。
|
|
53
|
-
|
|
54
|
-
此外,通过 `husky` 添加了 `git hook`,配合 `lint-staged` 对提交的代码进行校验。与 `commitlint` 结合使用,以确保 `git` 提交信息符合规范。
|
|
55
|
-
|
|
56
|
-
### 本地引用与发包替换
|
|
57
|
-
|
|
58
|
-
利用 `publishConfig` 会在发包的时候替换 `package.json` 字段的方式,在本地包相互引用的时候,都使用 `Typescript` 源文件的方式导出,在 `publishConfig` 里定义的导出为,真正在不同环境中,指向 `dist` 中不同格式的产物地址。
|
|
59
|
-
|
|
60
|
-
通过这种方式,可以大大加速整个 `monorepo` 的开发测试速度,避免反复通过 `watch` 来构建 `dist` 和 `sourcemap`,也避免一构建出产物,对应的 `Typescript` 文件,就报错的问题。
|
|
61
|
-
|
|
62
|
-
### 发包流程
|
|
63
|
-
|
|
64
|
-
现在使用 pnpm 原生 versioning:用 `pnpm change` 记录意图,用 `pnpm version -r` 生成版本和 changelog,再用 `pnpm publish -r` 发布。版本计划保留在 `.changeset/ledger.yaml`,预发布则由 pnpm lanes 管理。
|
|
65
|
-
|
|
66
|
-
### Github 相关配置
|
|
67
|
-
|
|
68
|
-
在 `.github` 目录下,我提供了默认的 `CI/CD` 流程配置,以及用户提交 `issue` 时的模板。经过少量配置后,就可以实现自动发布 `npm` 包、创建 `git tag` 以及生成 `GitHub release`。
|
|
69
|
-
|
|
70
|
-
此外,模板里还有许多为 `GitHub` 显示优化的 `md` 文档。
|
|
71
|
-
|
|
72
|
-
## 文档部署
|
|
73
|
-
|
|
74
|
-
文档是一个 VitePress 静态站点,以名为 `repoctl-docs` 的 Cloudflare Worker 发布。Workers Static Assets 直接托管 `.vitepress/dist`,同时处理自定义 404 页面和 `_redirects` 兼容规则。站点没有动态请求逻辑,因此不额外编写 Worker handler,也不声明 `ASSETS` binding。
|
|
75
|
-
|
|
76
|
-
Cloudflare Workers Builds 从仓库根目录执行:
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
pnpm --filter @icebreakers/website build
|
|
80
|
-
pnpm --filter @icebreakers/website run deploy
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
非生产分支使用 `pnpm --filter @icebreakers/website run deploy:preview` 上传预览版本。生产发布前运行 `pnpm --filter @icebreakers/website run deploy:dry-run`,校验静态资产清单和 Wrangler 配置。需要回滚时,先用 `wrangler versions list` 确认版本,再执行 `wrangler rollback <VERSION_ID>`。
|
|
84
|
-
|
|
85
|
-
唯一主域名是 `https://repoctl.icebreaker.top`。`repo.icebreaker.top` 和 `monorepo.icebreaker.top` 只作为兼容入口,由 Cloudflare 301 跳转到主域名,并保留原路径与查询参数。
|
|
86
|
-
|
|
87
|
-
## 总结
|
|
88
|
-
|
|
89
|
-
从单仓到 `monorepo` 的转变不仅仅是对工具的选择,更是对项目管理模式的优化。通过采用合适的工具链,能够更高效地管理多包项目的同时,利用 `CI/CD` 确保代码的质量和发布的顺畅。
|
|
90
|
-
|
|
91
|
-
希望这些思考对你有所帮助,也欢迎大家提出各种建议和意见。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/0.npm-basic-package/package.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/package.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package-lock.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/rename-ext.js
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/src/index.ts
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.cjs.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.esm.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package-lock.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/src/index.ts
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsconfig.json
RENAMED
|
File without changes
|
/package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsdown.config.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|