@mznjs/mbump 2.0.3 → 2.2.0

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 CHANGED
@@ -1,1720 +1,488 @@
1
1
  # mbump
2
2
 
3
- 企业级版本管理工具,支持单包和 monorepo 场景。
3
+ 企业级版本管理工具,支持单包和 Monorepo 场景,让版本更新变得简单高效。
4
4
 
5
5
  ## ✨ 功能特性
6
6
 
7
- - 基础版本递增 (major/minor/patch)
8
- - 预发布版本支持 (pre-patch/pre-minor/pre-major)
9
- - ✅ 自定义版本号输入
10
- - CHANGELOG 自动生成
11
- - Git Tag 管理(支持自定义前缀)
12
- - ✅ Git 自动提交和推送
13
- - 多包管理 (monorepo)
14
- - ✅ **交互式版本选择** - 可视化选择版本类型
15
- - ✅ 试运行模式 (dry-run)
16
- - NPM/PNPM 发布支持
17
- - ✅ **多格式配置文件支持** (TS/JS/JSON/YAML/TOML)
18
- - ✅ 智能配置加载(支持异步/同步)
19
- - ✅ 未提交更改检测与处理
20
- - ✅ 详细日志输出模式
7
+ - **版本管理**:支持 major/minor/patch 递增,以及 pre-release 版本
8
+ - **Monorepo 支持**:管理多个包的版本,支持批量更新
9
+ - **交互式选择**:可视化选择版本类型,无需记忆命令参数
10
+ - **Git 集成**:自动提交、打 Tag、推送到远程仓库
11
+ - **CHANGELOG 生成**:根据 Git 提交自动生成更新日志
12
+ - **路径模式**:直接指定项目目录,无需配置文件
13
+ - **Rust 支持**:更新 Cargo.toml 中的版本号
14
+ - **安全检查**:检测未提交更改,防止版本状态不一致
15
+ - **Dry-run 模式**:预览将要执行的操作,避免误操作
16
+ - **多格式配置**:支持 TS/JS/JSON/YAML/TOML 等多种配置格式
21
17
 
22
18
  ## 📦 安装
23
19
 
24
- ```bash
25
- npm install -g @mznjs/mbump
26
- # 或
27
- pnpm add -g @mznjs/mbump
28
- ```
29
-
30
- ## 🚀 快速开始
31
-
32
- ### 单包项目
33
-
34
- ```bash
35
- # 升级补丁版本
36
- mbump patch
37
-
38
- # 升级小版本
39
- mbump minor
40
-
41
- # 升级主版本
42
- mbump major
43
-
44
- # 交互式选择版本类型
45
- mbump
46
- ```
47
-
48
- ### Monorepo 项目
49
-
50
- 创建配置文件 `.mbump.config.json`:
51
-
52
- ```json
53
- {
54
- "packagePaths": {
55
- "components": "packages/components/package.json",
56
- "cli": "packages/cli/package.json",
57
- "core": "packages/core/package.json"
58
- }
59
- }
60
- ```
61
-
62
- ```bash
63
- # 更新所有包(交互式选择每个包的版本)
64
- mbump all
65
-
66
- # 更新指定包
67
- mbump components minor
68
-
69
- # 试运行模式(不实际执行)
70
- mbump components minor --dry-run
71
-
72
- # 更新版本并发布到 npm/pnpm
73
- mbump components patch --npm
74
- ```
75
-
76
- ## 💻 命令行参数
77
-
78
- ```
79
- 用法: mbump [package] [type] [options]
80
-
81
- 参数:
82
- [package] 要更新的包名称或 "all" 更新所有包
83
- [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major
84
-
85
- 选项:
86
- --dry-run, -d 试运行模式,只显示将要执行的操作
87
- --verbose, -v 详细输出模式,显示更多执行细节
88
- --no-commit, -n 禁用自动git提交
89
- --no-push, -p 禁用自动推送到远程仓库
90
- --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
91
- --npm 启用npm/pnpm包发布功能(默认不发布)
92
- --show-config 显示当前加载的完整配置信息
93
- --help, -h 显示此帮助信息
94
-
95
- 示例:
96
- mbump components patch # 将components包升级一个补丁版本
97
- mbump all minor # 将所有包升级一个小版本
98
- mbump plugins major --dry-run # 试运行升级plugins包主版本
99
- mbump core patch --no-push # 更新版本并提交到本地,但不推送到远程
100
- mbump components patch --npm # 更新版本并发布到npm/pnpm
101
- mbump # 交互式选择包和版本类型
102
- mbump --show-config # 查看当前配置
103
- ```
104
-
105
- ## ⚙️ 配置文件
106
-
107
- mbump 支持多种配置格式,并提供灵活的加载策略。
108
-
109
- ### 支持的配置文件格式
110
-
111
- | 格式 | 文件扩展名 | 异步加载 | 同步加载 | 说明 |
112
- |------|-----------|---------|---------|------|
113
- | TypeScript | `.ts` | ✅ | ❌ | 需要 tsx,提供类型安全 |
114
- | ES Module | `.mjs` | ✅ | ❌ | 使用 `export default` |
115
- | JavaScript | `.js` | ✅ | ⚠️ | 优先 ES Module,兼容 CommonJS |
116
- | CommonJS | `.cjs` | ✅ | ✅ | 使用 `module.exports` |
117
- | JSON | `.json`, `.jsonc` | ✅ | ✅ | 标准 JSON 或带注释 JSON |
118
- | YAML | `.yaml`, `.yml` | ✅ | ✅ | YAML 格式 |
119
- | TOML | `.toml` | ✅ | ✅ | TOML 格式 |
120
- | package.json | - | ✅ | ✅ | 在 `mbump` 字段中配置 |
121
-
122
- **配置文件前缀**: 支持 `.mbump.config.*` 和 `.zbump.config.*`
123
-
124
- ### 配置文件优先级
125
-
126
- 配置加载器会按以下顺序查找配置文件(找到第一个即停止):
127
-
128
- 1. TypeScript (`.ts`)
129
- 2. ES Module (`.mjs`)
130
- 3. JavaScript (`.js`)
131
- 4. CommonJS (`.cjs`)
132
- 5. JSON (`.json`, `.jsonc`)
133
- 6. YAML (`.yaml`, `.yml`)
134
- 7. TOML (`.toml`)
135
- 8. package.json
136
-
137
- ### 配置示例
138
-
139
- #### ES Module 格式(推荐)⭐
140
-
141
- ```javascript
142
- // .mbump.config.mjs
143
- export default {
144
- packagePaths: {
145
- components: 'packages/components/package.json',
146
- cli: 'packages/cli/package.json',
147
- },
148
- defaults: {
149
- releaseType: 'patch',
150
- },
151
- }
152
- ```
153
-
154
- #### TypeScript 格式
155
-
156
- ```typescript
157
- // .mbump.config.ts
158
- import type { Config } from '@mznjs/mbump'
159
-
160
- export default {
161
- packagePaths: {
162
- components: 'packages/components/package.json',
163
- },
164
- defaults: {
165
- releaseType: 'minor',
166
- },
167
- } satisfies Config
168
- ```
169
-
170
- #### CommonJS 格式
171
-
172
- ```javascript
173
- // .mbump.config.cjs
174
- module.exports = {
175
- packagePaths: {
176
- components: 'packages/components/package.json',
177
- },
178
- }
179
- ```
180
-
181
- #### JSON 格式
182
-
183
- ```json
184
- {
185
- "packagePaths": {
186
- "components": "packages/components/package.json",
187
- "cli": "packages/cli/package.json"
188
- },
189
- "defaults": {
190
- "releaseType": "patch"
191
- },
192
- "git": {
193
- "commitMessage": "chore: bump version to {{newVersion}}",
194
- "push": true,
195
- "autoCommit": true,
196
- "tag": true,
197
- "tagPrefix": "v",
198
- "changelog": true
199
- },
200
- "publish": {
201
- "command": "pnpm publish --access public --no-git-checks",
202
- "skipChecks": true
203
- }
204
- }
205
- ```
206
-
207
- #### YAML 格式
208
-
209
- ```yaml
210
- # .mbump.config.yaml
211
- packagePaths:
212
- components: packages/components/package.json
213
- cli: packages/cli/package.json
214
-
215
- defaults:
216
- releaseType: patch
217
-
218
- git:
219
- commitMessage: "chore: bump version to {{newVersion}}"
220
- push: true
221
- autoCommit: true
222
- tag: true
223
- tagPrefix: v
224
- changelog: true
225
-
226
- publish:
227
- command: "pnpm publish --access public --no-git-checks"
228
- skipChecks: true
229
- ```
230
-
231
- #### TOML 格式
232
-
233
- ```toml
234
- # .mbump.config.toml
235
- [packagePaths]
236
- components = "packages/components/package.json"
237
- cli = "packages/cli/package.json"
238
-
239
- [defaults]
240
- releaseType = "patch"
241
-
242
- [git]
243
- commitMessage = "chore: bump version to {{newVersion}}"
244
- push = true
245
- autoCommit = true
246
- tag = true
247
- tagPrefix = "v"
248
- changelog = true
249
-
250
- [publish]
251
- command = "pnpm publish --access public --no-git-checks"
252
- skipChecks = true
253
- ```
254
-
255
- #### package.json 格式
256
-
257
- ```json
258
- {
259
- "name": "my-monorepo",
260
- "version": "1.0.0",
261
- "mbump": {
262
- "packagePaths": {
263
- "components": "packages/components/package.json",
264
- "cli": "packages/cli/package.json"
265
- }
266
- }
267
- }
268
- ```
269
-
270
- #### 函数导出
271
-
272
- 配置文件也可以导出一个函数,该函数会被自动调用以获取配置:
273
-
274
- ```javascript
275
- // .mbump.config.js
276
- export default () => ({
277
- packagePaths: {
278
- components: 'packages/components/package.json',
279
- },
280
- })
281
- ```
282
-
283
- ### 配置选项详解
284
-
285
- #### 根选项
286
-
287
- | 选项 | 类型 | 默认值 | 说明 |
288
- |------|------|--------|------|
289
- | `packagePaths` | `Record<string, string>` | `{ default: 'package.json' }` | 包路径映射(必需) |
290
-
291
- #### defaults 选项
292
-
293
- | 选项 | 类型 | 默认值 | 说明 |
294
- |------|------|--------|------|
295
- | `releaseType` | `string` | `'patch'` | 默认版本类型 |
296
- | `dryRun` | `boolean` | `false` | 默认试运行模式 |
297
- | `verbose` | `boolean` | `false` | 默认详细输出 |
298
- | `allowUncommitted` | `boolean` | `false` | 允许未提交更改 |
299
- | `npm` | `boolean` | `false` | 默认启用发布 |
300
-
301
- #### git 选项
302
-
303
- | 选项 | 类型 | 默认值 | 说明 |
304
- |------|------|--------|------|
305
- | `commitMessage` | `string` | `'chore: bump version to {{newVersion}}'` | Git 提交消息模板(支持 `{{newVersion}}` 占位符) |
306
- | `push` | `boolean` | `true` | 是否自动推送到远程仓库 |
307
- | `autoCommit` | `boolean` | `true` | 是否自动提交更改 |
308
- | `tag` | `boolean` | `true` | 是否创建 Git 标签 |
309
- | `tagPrefix` | `string` | `'v'` | 标签前缀(如 `v1.0.0`)。**注意**:仅主项目包使用此配置,子包使用 `{包名}@{版本号}` 格式 |
310
- | `changelog` | `boolean` | `true` | 是否生成 CHANGELOG。**注意**:在 `mbump all` 批量更新时,只有主项目包会生成 CHANGELOG,子包跳过此步骤 |
311
-
312
- **Git Tag 策略**:
313
-
314
- mbump 根据包的类型采用不同的 Tag 命名策略:
315
-
316
- #### 主项目包 (default / root package)
317
- - **Tag 格式**: `{tagPrefix}{version}`
318
- - **使用前缀**: 是(默认 `v`)
319
- - **识别条件**: 包名为 `default` 或包路径为 `package.json`(根目录)
320
- - **示例**:
321
- ```bash
322
- mbump default patch
323
- # 假设 package.json 中 "name": "@my-org/monorepo"
324
- # → 创建 Tag: v1.0.1
325
-
326
- # 自定义前缀
327
- mbump default minor
328
- # 如果配置 git.tagPrefix = "release-"
329
- # → 创建 Tag: release-1.1.0
330
- ```
331
-
332
- #### 子包 (所有非主项目包)
333
- - **Tag 格式**: `{package-name}@{version}`
334
- - **不使用前缀**: 直接使用 package.json 中的 `name` 字段
335
- - **适用场景**:
336
- - 单独更新子包:`mbump components patch`
337
- - 批量更新所有包:`mbump all`
338
- - **示例**:
339
- ```bash
340
- mbump components patch
341
- # 假设 components/package.json 中 "name": "@my-org/components"
342
- # → 创建 Tag: @my-org/components@1.0.1
343
-
344
- mbump cli minor
345
- # 假设 cli/package.json 中 "name": "@my-org/cli"
346
- # → 创建 Tag: @my-org/cli@2.3.0
347
- ```
348
-
349
- #### 批量更新 (mbump all)
350
- 当使用 `mbump all` 时,会为每个包创建相应的 Tag:
351
- ```bash
352
- mbump all
353
- # → 主项目包: v1.0.1 (使用 tagPrefix)
354
- # → 子包们:
355
- # - @my-org/components@1.0.1
356
- # - @my-org/cli@2.3.0
357
- # - @my-org/core@0.5.2
358
- ```
359
-
360
- **优势**:
361
- - ✅ 主项目包保持简洁的 `v1.0.1` 格式,符合传统习惯
362
- - ✅ 子包使用清晰的 `{包名}@{版本号}` 格式,便于区分
363
- - ✅ 清晰区分主项目和子包的版本历史
364
- - ✅ 便于单独回滚某个包到特定版本
365
- - ✅ 符合 Monorepo 最佳实践(类似 pnpm、lerna)
366
- - ✅ 支持独立的 CI/CD 流程
367
-
368
- #### CHANGELOG 生成策略
369
-
370
- mbump 在不同场景下采用不同的 CHANGELOG 生成策略:
371
-
372
- **单包更新** (`mbump components patch`):
373
- - ✅ 为该包生成 CHANGELOG.md
374
- - ✅ 记录从上一个 Tag 到当前的所有 commits
375
- - ✅ **标题格式**: `[package-name@version]`,例如 `[@mznjs/components@1.0.1]`
376
-
377
- **批量更新** (`mbump all`):
378
- - ✅ **主项目包**:生成 CHANGELOG.md(如果 `git.changelog = true`)
379
- - ❌ **子包**:跳过 CHANGELOG 生成,避免重复和混乱
380
-
381
- **原因**:
382
- - Monorepo 项目中,所有包的 commits 通常都在同一个仓库中
383
- - 为每个子包单独生成 CHANGELOG 会导致内容重复
384
- - 只在主项目包生成一份完整的 CHANGELOG 更清晰、更易维护
385
-
386
- **CHANGELOG 标题格式**:
387
- - **主项目包**: `[v1.0.1]` (使用 tagPrefix)
388
- - **子包**: `[@mznjs/components@1.0.1]` (使用 package.json 的 name 字段)
389
-
390
- **示例**:
391
- ```bash
392
- # 单包更新 - 会生成 CHANGELOG
393
- mbump components patch
394
- # → CHANGELOG.md 中添加: ## [@mznjs/components@1.0.1] - 2024-01-15 ✅
395
-
396
- # 主项目包单独更新
397
- mbump default patch
398
- # → CHANGELOG.md 中添加: ## [v1.0.1] - 2024-01-15 ✅
399
-
400
- # 批量更新 - 只有主项目包生成 CHANGELOG
401
- mbump all
402
- # → 主项目包: CHANGELOG.md 中添加: ## [v1.0.1] - 2024-01-15 ✅
403
- # → 子包 components: 子包 components 跳过 CHANGELOG 生成
404
- # → 子包 cli: 子包 cli 跳过 CHANGELOG 生成
405
- ```
406
-
407
- 如需为子包单独生成 CHANGELOG,可以单独更新该包:
408
- ```bash
409
- mbump components patch --changelog
410
- ```
411
-
412
- #### publish 选项
413
-
414
- | 选项 | 类型 | 默认值 | 说明 |
415
- |------|------|--------|------|
416
- | `command` | `string` | `'pnpm publish --access public --no-git-checks'` | 发布命令 |
417
- | `skipChecks` | `boolean` | `true` | 跳过安全检查 |
418
-
419
- ### 配置最佳实践
420
-
421
- #### 单包项目
422
-
423
- ```json
424
- {
425
- "packagePaths": {
426
- "default": "package.json"
427
- }
428
- }
429
- ```
430
-
431
- #### Monorepo 项目
432
-
433
- ```javascript
434
- // .mbump.config.mjs
435
- export default {
436
- packagePaths: {
437
- // 核心包
438
- core: 'packages/core/package.json',
439
- // UI 组件库
440
- components: 'packages/components/package.json',
441
- // CLI 工具
442
- cli: 'packages/cli/package.json',
443
- // 插件系统
444
- plugins: 'packages/plugins/package.json',
445
- },
446
- defaults: {
447
- releaseType: 'patch',
448
- verbose: false,
449
- },
450
- git: {
451
- commitMessage: 'chore(release): bump {{name}} to {{newVersion}}',
452
- tagPrefix: '',
453
- },
454
- publish: {
455
- command: 'pnpm publish --access public --no-git-checks',
456
- skipChecks: true,
457
- },
458
- }
459
- ```
460
-
461
- ## 🔌 API 使用
462
-
463
- ```typescript
464
- import { VersionManager, loadConfig, loadConfigAsync } from '@mznjs/mbump'
465
-
466
- // 异步加载配置(推荐)
467
- const config = await loadConfigAsync(process.cwd())
468
- const manager = new VersionManager({ config, rootDir: process.cwd() })
469
-
470
- // 同步加载配置
471
- const config = loadConfig(process.cwd())
472
- const manager = new VersionManager({ config, rootDir: process.cwd() })
473
-
474
- // 更新单个包版本
475
- const result = await manager.updateVersion('my-package', 'minor', {
476
- dryRun: false,
477
- verbose: true,
478
- autoCommit: true,
479
- push: true,
480
- npm: false,
481
- })
482
-
483
- console.log(result.updatedPackages)
484
- // [
485
- // {
486
- // name: 'my-package',
487
- // oldVersion: '1.0.0',
488
- // newVersion: '1.1.0'
489
- // }
490
- // ]
491
-
492
- // 获取包当前版本
493
- const version = manager.getPackageVersion('my-package')
494
- console.log(version) // '1.0.0'
495
-
496
- // 手动提交和推送
497
- await manager.gitCommitAndPush(true) // true = 推送到远程
498
- ```
499
-
500
- ## 🛡️ 批量更新容错处理
501
-
502
- `mbump all` 命令具有完善的容错处理机制,确保单个包更新失败不会影响其他包的正常更新。
503
-
504
- ### 工作原理
505
-
506
- 1. **错误收集**:每个包的更新操作都被 try-catch 包裹,失败时记录错误但继续处理下一个包
507
- 2. **部分成功**:即使部分包失败,成功的包仍然可以完成版本更新、CHANGELOG 生成、Git 提交等操作
508
- 3. **统一报告**:所有包处理完成后,统一报告失败的包及其错误信息
509
- 4. **独立发布**:NPM 发布阶段也采用相同的容错机制,一个包发布失败不影响其他包
510
-
511
- ### 使用示例
512
-
513
- ```bash
514
- # 批量更新所有包
515
- mbump all patch
516
- ```
517
-
518
- **正常情况输出**:
519
- ```bash
520
- ✓ 包 components 更新完成
521
- ✓ 包 cli 更新完成
522
- ✓ 包 core 更新完成
523
- ✓ 已提交 3 个包的更改到 Git
524
- ✓ 已推送到远程仓库
525
- ✅ 版本更新完成
526
- ```
527
-
528
- **部分失败情况输出**:
529
- ```bash
530
- ✓ 包 components 更新完成
531
- ⚠️ 包 cli 更新失败: Git conflict detected
532
- ✓ 包 core 更新完成
533
- ✓ 包 utils 更新完成
534
-
535
- ❌ 批量更新完成,但有 1 个包更新失败:
536
- - cli: Git conflict detected
537
-
538
- 💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行
539
-
540
- ✓ 已提交 3 个包的更改到 Git
541
- ✓ 已推送到远程仓库
542
- ✅ 版本更新完成
543
- ```
544
-
545
- ### 失败后的处理
546
-
547
- 如果某个包更新失败,你可以:
548
-
549
- 1. **查看错误信息**:根据提示的错误信息进行修复
550
- 2. **单独重试**:修复后单独更新失败的包
551
- ```bash
552
- mbump cli patch
553
- ```
554
- 3. **跳过 NPM 发布**:如果只是想更新版本和提交 Git
555
- ```bash
556
- mbump all patch --no-npm
557
- ```
558
-
559
- ### 技术细节
560
-
561
- - **错误类型**:收集 `Error` 对象,保留完整的错误消息
562
- - **日志级别**:
563
- - 单个包失败:黄色警告 (`⚠️`)
564
- - 最终汇总:红色错误 (`❌`)
565
- - 提示信息:蓝色信息 (`💡`)
566
- - **Git 原子性**:所有成功的包会被一起提交到一个 Git commit 中
567
- - **NPM 独立性**:每个包的 NPM 发布是独立的,互不影响
568
-
569
- ## 🔍 Dry-run 模式增强
570
-
571
- `--dry-run`(或 `-d`)选项允许你在实际执行操作之前预览将要进行的更改。增强后的 dry-run 模式会显示详细的预览信息,帮助你确认操作是否符合预期。
572
-
573
- ### 单包更新预览
574
-
575
- ```bash
576
- mbump components patch --dry-run
577
- ```
578
-
579
- **输出示例**:
580
- ```
581
- 🔍 Dry-run 模式 - 以下操作将被执行:
582
-
583
- 📦 components
584
- 当前版本: 1.0.0
585
- 新版本: 1.0.1
586
- Tag: @mznjs/components@1.0.1
587
- CHANGELOG: 是
588
- Git Commit: 是
589
- Git Push: 是
590
- NPM Publish: 否
591
-
592
- ✅ 以上为预览,未执行任何实际操作
593
- ```
594
-
595
- ### 批量更新预览
596
-
597
- ```bash
598
- mbump all minor --dry-run
599
- ```
600
-
601
- **输出示例**:
602
- ```
603
- 🔍 Dry-run 模式 - 以下操作将被执行:
604
-
605
- 📦 default
606
- 当前版本: 0.0.1
607
- 新版本: 0.1.0
608
- Tag: v0.1.0
609
- CHANGELOG: 是
610
-
611
- 📦 components
612
- 当前版本: 1.0.0
613
- 新版本: 1.1.0
614
- Tag: @mznjs/components@1.1.0
615
- CHANGELOG: 跳过(子包或配置禁用)
616
-
617
- 📦 cli
618
- 当前版本: 2.0.0
619
- 新版本: 2.1.0
620
- Tag: @mznjs/cli@2.1.0
621
- CHANGELOG: 跳过(子包或配置禁用)
622
-
623
- ✅ 以上为预览,未执行任何实际操作
624
- ```
625
-
626
- ### 预览信息说明
627
-
628
- Dry-run 模式会显示以下关键信息:
629
-
630
- 1. **📦 包名**:要更新的包名称
631
- 2. **当前版本**:包的当前版本号
632
- 3. **新版本**:将要升级到的版本号
633
- 4. **Tag**:将要创建的 Git Tag 名称
634
- - 主项目包:`v{version}` 格式
635
- - 子包:`{package-name}@{version}` 格式
636
- 5. **CHANGELOG**:是否会生成 CHANGELOG
637
- - 主项目包:根据 `git.changelog` 配置
638
- - 子包:批量更新时跳过,单包更新时生成
639
- 6. **Git Commit**:是否会自动提交到 Git(仅单包更新显示)
640
- 7. **Git Push**:是否会自动推送到远程仓库(仅单包更新显示)
641
- 8. **NPM Publish**:是否会发布到 NPM(仅单包更新显示)
642
-
643
- ### 使用场景
644
-
645
- 1. **验证版本计算**:确认新版本号是否正确
646
- 2. **检查 Tag 命名**:预览将要创建的 Git Tag 名称
647
- 3. **确认操作范围**:了解哪些包会被更新
648
- 4. **避免误操作**:在实际执行前发现潜在问题
649
- 5. **团队协作**:在 PR 中展示将要进行的更改
650
-
651
- ### 注意事项
652
-
653
- - Dry-run 模式不会修改任何文件
654
- - 不会创建 Git commits 或 tags
655
- - 不会发布到 NPM
656
- - 适合用于 CI/CD 流程中的预检步骤
657
- - 可以与 `--verbose` 结合使用获取更多信息
658
-
659
- ## ⚠️ 错误提示优化
660
-
661
- mbump 提供了友好的错误提示信息,帮助用户快速理解和解决问题。
662
-
663
- ### 常见错误及解决方案
664
-
665
- #### 1. 版本已存在
666
-
667
- **错误信息**:
668
- ```
669
- ⚠️ 版本 v1.0.1 已存在
670
- 💡 请使用其他版本号,或运行 git tag -d <tag> 删除已有标签
671
- ```
672
-
673
- **原因**:尝试创建的 Git Tag 已经存在
674
-
675
- **解决方案**:
676
- - 使用不同的版本号
677
- - 或删除已有的 tag:`git tag -d v1.0.1 && git push origin :refs/tags/v1.0.1`
678
-
679
- #### 2. Git 冲突
680
-
681
- **错误信息**:
682
- ```
683
- ⚠️ 检测到 Git 冲突
684
- 💡 请先解决冲突后重试:git add . && git commit -m "resolve conflicts"
685
- ```
686
-
687
- **原因**:工作区有未解决的合并冲突
688
-
689
- **解决方案**:
690
- - 手动解决冲突
691
- - 提交解决后的更改
692
- - 重新运行 mbump
693
-
694
- #### 3. NPM 认证失败
695
-
696
- **错误信息**:
697
- ```
698
- 🔐 NPM 认证失败
699
- 💡 请运行 npm login 或 pnpm login 登录后重试
700
- ```
701
-
702
- **原因**:未登录或登录凭证过期
703
-
704
- **解决方案**:
705
- - 运行 `npm login` 或 `pnpm login`
706
- - 输入用户名、密码和邮箱
707
- - 重新运行 mbump
708
-
709
- #### 4. NPM 包已存在
710
-
711
- **错误信息**:
712
- ```
713
- 📦 NPM 包已存在或无权限
714
- 💡 检查包名是否已被占用,或确认是否有发布权限
715
- ```
716
-
717
- **原因**:包名已被他人注册,或没有发布权限
718
-
719
- **解决方案**:
720
- - 检查包名是否唯一
721
- - 联系包的所有者获取权限
722
- - 或使用 scoped package(如 @my-org/package-name)
723
-
724
- #### 5. 网络连接失败
725
-
726
- **错误信息**:
727
- ```
728
- 🌐 网络连接失败
729
- 💡 请检查网络连接,或配置 NPM 镜像源
730
- ```
731
-
732
- **原因**:网络不通或 NPM registry 无法访问
733
-
734
- **解决方案**:
735
- - 检查网络连接
736
- - 配置国内镜像源:
737
- ```bash
738
- npm config set registry https://registry.npmmirror.com
739
- # 或
740
- pnpm config set registry https://registry.npmmirror.com
741
- ```
742
-
743
- #### 6. 文件路径安全
744
-
745
- **错误信息**:
746
- ```
747
- 🔒 检测到不安全的文件路径
748
- 💡 请确保配置文件中的路径在项目根目录内
749
- ```
750
-
751
- **原因**:配置文件中的路径指向项目外部
752
-
753
- **解决方案**:
754
- - 检查 `.mbump.config.js` 中的 `packagePaths`
755
- - 确保所有路径都在项目根目录内
756
-
757
- #### 7. 无效的包名
758
-
759
- **错误信息**:
760
- ```
761
- ❌ 无效的包名
762
- 💡 请检查配置文件中的 packagePaths 是否正确设置
763
- ```
764
-
765
- **原因**:指定的包名在配置中不存在
766
-
767
- **解决方案**:
768
- - 检查 `.mbump.config.js` 中的 `packagePaths` 配置
769
- - 确保包名与配置中的 key 一致
770
-
771
- ### 调试模式
772
-
773
- 如果遇到未知错误,可以使用 `DEBUG` 环境变量查看详细信息:
774
-
775
- ```bash
776
- # Linux/Mac
777
- DEBUG=true mbump components patch
778
-
779
- # Windows PowerShell
780
- $env:DEBUG="true"; mbump components patch
781
-
782
- # Windows CMD
783
- set DEBUG=true && mbump components patch
784
- ```
785
-
786
- 这将显示完整的错误堆栈信息,便于排查问题。
787
-
788
- ### 批量更新错误报告
789
-
790
- 在批量更新模式下,如果部分包失败,会统一报告:
791
-
792
- ```
793
- ❌ 批量更新完成,但有 1 个包更新失败:
794
- - cli: Git conflict detected
795
-
796
- 💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行
797
- ```
798
-
799
- 每个失败的包都会显示友好的错误提示和解决方案。
800
-
801
- ## 📊 进度条显示
802
-
803
- 在批量更新模式下,mbump 会实时显示更新进度,让你清楚地了解当前处理状态。
804
-
805
- ### 进度条格式
806
-
807
- ```
808
- [████████████░░░░░░░░░░░░░░░░░░] 40% | 2/5 | ⟳ components - 处理中
809
- ```
810
-
811
- **组成部分**:
812
- - **进度条**:`[████████████░░░░░░░░░░░░░░░░░░]` 可视化进度
813
- - **百分比**:`40%` 完成百分比
814
- - **计数**:`2/5` 当前进度/总数
815
- - **状态图标**:
816
- - `⟳` 处理中
817
- - `✓` 成功
818
- - `✗` 失败
819
- - **包名**:当前处理的包名称
820
- - **状态文本**:处理中/完成/失败
821
-
822
- ### 使用示例
823
-
824
- #### 批量更新进度
825
-
826
- ```bash
827
- mbump all patch
828
- ```
829
-
830
- **输出示例**:
831
- ```
832
- 📦 开始批量更新 5 个包...
833
-
834
- [██████████████████████████████] 100% | ✓ cli - 完成
835
- [██████████████████████████████] 100% | ✓ components - 完成
836
- [██████████████████████████████] 100% | ✓ core - 完成
837
- [██████████████████████████████] 100% | ✓ theme - 完成
838
- [██████████████████████████████] 100% | ✓ utils - 完成
839
-
840
- ✅ 版本更新完成
841
- ```
842
-
843
- #### NPM 发布进度
844
-
845
- ```bash
846
- mbump all patch --npm
847
- ```
848
-
849
- **输出示例**:
850
- ```
851
- 📦 开始批量更新 5 个包...
852
-
853
- [██████████████████████████████] 100% | ✓ cli - 完成
854
- [██████████████████████████████] 100% | ✓ components - 完成
855
- ...
856
-
857
- 🚀 开始发布 5 个包到 NPM...
858
-
859
- [██████████████████████████████] 100% | ✓ @mznjs/cli - 完成
860
- [██████████████████████████████] 100% | ✓ @mznjs/components - 完成
861
- ...
862
-
863
- ✅ 版本更新完成
864
- ```
865
-
866
- #### 部分失败情况
867
-
868
- ```bash
869
- mbump all patch
870
- ```
871
-
872
- **输出示例**:
873
- ```
874
- 📦 开始批量更新 5 个包...
875
-
876
- [██████████████████████████████] 100% | ✓ cli - 完成
877
- [██████████████████████████████] 100% | ✓ components - 完成
878
- [██████████████████████████████] 100% | ✗ core - 失败
879
- [██████████████████████████████] 100% | ✓ theme - 完成
880
- [██████████████████████████████] 100% | ✓ utils - 完成
881
-
882
- ❌ 批量更新完成,但有 1 个包更新失败:
883
- - core: Git conflict detected
884
-
885
- 💡 提示: 可以单独重试失败的包,或检查错误信息后重新运行
886
- ```
887
-
888
- ### 特性说明
889
-
890
- 1. **实时更新**:进度条在处理每个包时实时更新
891
- 2. **状态反馈**:清晰显示每个包的处理状态(处理中/成功/失败)
892
- 3. **视觉友好**:使用 Unicode 字符绘制美观的进度条
893
- 4. **自动换行**:每个包处理完成后自动换行,保留历史记录
894
- 5. **双阶段进度**:版本更新和 NPM 发布分别显示进度
895
-
896
- ### 技术实现
897
-
898
- - **进度计算**:`(current / total) * 100` 计算百分比
899
- - **进度条渲染**:使用 `█` 和 `░` 字符填充
900
- - **光标控制**:使用 `\r` 回车符实现原地更新
901
- - **状态管理**:维护 processing/success/failed 三种状态
902
-
903
- ### 注意事项
904
-
905
- - 进度条仅在批量更新模式下显示
906
- - 单包更新不使用进度条(因为只有一个包)
907
- - Dry-run 模式不显示进度条(直接显示预览后退出)
908
- - 进度条宽度固定为 30 个字符,适应各种终端宽度
909
-
910
- ## ⚡ 性能优化(缓存机制)
911
-
912
- mbump 内置了智能缓存机制,显著提升批量操作的性能,特别是在大型 Monorepo 项目中。
913
-
914
- ### 缓存策略
915
-
916
- #### 1. 配置缓存
917
-
918
- **功能**:避免重复读取和解析配置文件
919
-
920
- **实现**:
921
- ```typescript
922
- // 自动缓存配置
923
- const config = await loadConfigAsync(rootDir)
924
-
925
- // 第二次调用直接使用缓存
926
- const config2 = await loadConfigAsync(rootDir) // 从缓存读取
927
- ```
928
-
929
- **缓存键**:项目根目录的绝对路径
930
-
931
- **清除缓存**:
932
- ```typescript
933
- import { clearConfigCache } from '@mznjs/mbump'
934
-
935
- // 清除指定项目的缓存
936
- clearConfigCache('/path/to/project')
937
-
938
- // 清除所有缓存
939
- clearConfigCache()
940
- ```
941
-
942
- #### 2. 包信息缓存
20
+ ### 全局安装(推荐)
943
21
 
944
- **功能**:预加载所有包信息到内存,避免重复读取 package.json 文件
945
-
946
- **实现**:
947
- ```typescript
948
- const manager = new VersionManager({ rootDir })
949
-
950
- // 构造函数中自动预加载所有包信息
951
- // 后续调用 getPackageInfo() 直接从缓存读取
22
+ ```bash
23
+ npm install -g @mznjs/mbump
24
+ # 或
25
+ pnpm add -g @mznjs/mbump
952
26
  ```
953
27
 
954
- **缓存管理 API**:
28
+ ### 本地安装
955
29
 
956
- ```typescript
957
- // 清除指定包的缓存
958
- manager.clearPackageCache('packages/components/package.json')
959
-
960
- // 清除所有包缓存
961
- manager.clearPackageCache()
962
-
963
- // 刷新指定包的缓存(重新从文件读取)
964
- const pkg = manager.refreshPackageCache('packages/components/package.json')
965
-
966
- // 获取缓存统计信息
967
- const stats = manager.getCacheStats()
968
- console.log(stats)
969
- // {
970
- // size: 5,
971
- // packages: [
972
- // 'packages/components/package.json',
973
- // 'packages/cli/package.json',
974
- // ...
975
- // ]
976
- // }
30
+ ```bash
31
+ npm install @mznjs/mbump -D
32
+ # 或
33
+ pnpm add @mznjs/mbump -D
977
34
  ```
978
35
 
979
- ### 性能提升效果
36
+ ## 🚀 快速开始
980
37
 
981
- #### 场景对比
38
+ ### 单包项目(零配置)
982
39
 
983
- **未使用缓存**:
984
40
  ```bash
985
- # 批量更新 10 个包
986
- mbump all patch
41
+ # 升级补丁版本
42
+ mbump patch
987
43
 
988
- # 每个包需要:
989
- # - 读取 package.json (10 次)
990
- # - 解析 JSON (10 次)
991
- # - 读取配置文件 (1 次)
992
- # 总计:21 次文件 I/O 操作
993
- ```
44
+ # 升级小版本
45
+ mbump minor
994
46
 
995
- **使用缓存后**:
996
- ```bash
997
- # 批量更新 10 个包
998
- mbump all patch
47
+ # 升级主版本
48
+ mbump major
999
49
 
1000
- # 优化后:
1001
- # - 预加载所有 package.json (10 次,但并行执行)
1002
- # - 后续操作全部从内存读取 (0 次 I/O)
1003
- # - 配置文件缓存 (1 次)
1004
- # 总计:11 次文件 I/O 操作,减少约 50%
50
+ # 交互式选择版本类型
51
+ mbump
1005
52
  ```
1006
53
 
1007
- #### 实际测试数据
1008
-
1009
- | 项目规模 | 包数量 | 优化前耗时 | 优化后耗时 | 提升 |
1010
- |---------|--------|-----------|-----------|------|
1011
- | 小型项目 | 3 个包 | 1.2s | 0.8s | 33% |
1012
- | 中型项目 | 10 个包 | 3.5s | 1.8s | 49% |
1013
- | 大型项目 | 50 个包 | 15.2s | 6.5s | 57% |
54
+ ### 路径模式
1014
55
 
1015
- ### 缓存失效场景
56
+ ```bash
57
+ # 更新指定目录下的项目(默认 patch)
58
+ mbump ./packages/my-pkg
1016
59
 
1017
- 缓存在以下情况下会自动失效:
60
+ # 指定版本类型
61
+ mbump ./packages/my-pkg minor
1018
62
 
1019
- 1. **文件修改**:当 `savePackageInfo()` 被调用时,会自动更新缓存
1020
- 2. **手动清除**:调用 `clearPackageCache()` 或 `clearConfigCache()`
1021
- 3. **进程重启**:缓存存储在内存中,进程退出后自动清除
63
+ # 使用上级目录
64
+ mbump ../other-project
65
+ ```
1022
66
 
1023
- ### 最佳实践
67
+ ### Monorepo 项目
1024
68
 
1025
- #### 1. 批量操作前预加载
69
+ 创建 `.mbump.config.ts` 配置文件:
1026
70
 
1027
71
  ```typescript
1028
- // VersionManager 构造函数已自动预加载
1029
- const manager = new VersionManager({ rootDir })
72
+ import type { Config } from '@mznjs/mbump'
1030
73
 
1031
- // 无需额外操作,直接使用即可
1032
- await manager.updateVersion('all', 'patch')
74
+ export default {
75
+ packagePaths: {
76
+ components: 'packages/components/package.json',
77
+ cli: 'packages/cli/package.json',
78
+ core: 'packages/core/package.json',
79
+ },
80
+ } satisfies Config
1033
81
  ```
1034
82
 
1035
- #### 2. 长时间运行的进程
83
+ 使用命令:
1036
84
 
1037
- ```typescript
1038
- // 如果文件可能被外部修改,定期刷新缓存
1039
- setInterval(() => {
1040
- manager.clearPackageCache()
1041
- }, 60000) // 每分钟清除一次缓存
1042
- ```
85
+ ```bash
86
+ # 更新指定包
87
+ mbump components patch
1043
88
 
1044
- #### 3. CI/CD 环境
89
+ # 更新所有包
90
+ mbump all
1045
91
 
1046
- ```typescript
1047
- // CI/CD 环境中可以禁用缓存(每次都是全新环境)
1048
- const manager = new VersionManager({
1049
- rootDir,
1050
- // 未来可以添加配置选项
1051
- })
92
+ # 试运行模式
93
+ mbump all minor --dry-run
1052
94
  ```
1053
95
 
1054
- #### 4. 调试模式
96
+ ## 📖 使用方法
97
+
98
+ ### 1. 指定包名或路径
1055
99
 
1056
100
  ```bash
1057
- # 启用调试模式查看缓存使用情况
1058
- DEBUG=true mbump all patch
101
+ # 使用包名(需要配置文件)
102
+ mbump <package-name> <type>
1059
103
 
1060
- # 输出示例:
1061
- # [DEBUG] 已预加载 5 个包的信息到缓存
1062
- # [DEBUG] 使用缓存的配置
1063
- # [DEBUG] 已缓存配置: /path/to/project
104
+ # 使用路径(无需配置文件)
105
+ mbump <path> <type>
1064
106
  ```
1065
107
 
1066
- ### 技术实现细节
1067
-
1068
- #### 配置缓存
1069
-
1070
- ```typescript
1071
- // 全局 Map 存储配置
1072
- const configCache = new Map<string, Config>()
1073
-
1074
- // 缓存键:项目根目录的绝对路径
1075
- const cacheKey = resolve(rootDir)
108
+ ### 2. 版本类型
1076
109
 
1077
- // 检查缓存
1078
- if (configCache.has(cacheKey)) {
1079
- return configCache.get(cacheKey)!
1080
- }
110
+ | 类型 | 说明 | 示例 |
111
+ |------|------|------|
112
+ | `major` | 主版本号递增 | 1.0.0 → 2.0.0 |
113
+ | `minor` | 次版本号递增 | 1.0.0 → 1.1.0 |
114
+ | `patch` | 修订号递增 | 1.0.0 → 1.0.1 |
115
+ | `pre-major` | 预发布主版本 | 1.0.0 → 2.0.0-beta.0 |
116
+ | `pre-minor` | 预发布次版本 | 1.0.0 → 1.1.0-beta.0 |
117
+ | `pre-patch` | 预发布修订版 | 1.0.0 → 1.0.1-beta.0 |
118
+ | `as-is` | 使用自定义版本 | 指定 customVersion |
1081
119
 
1082
- // 设置缓存
1083
- configCache.set(cacheKey, config)
1084
- ```
120
+ ### 3. 常用命令示例
1085
121
 
1086
- #### 包信息缓存
122
+ ```bash
123
+ # 更新补丁版本
124
+ mbump patch
1087
125
 
1088
- ```typescript
1089
- // 实例级 Map 存储包信息
1090
- private packageCache: Map<string, PackageInfo> = new Map()
1091
-
1092
- // 预加载
1093
- private _preloadPackageCache(): void {
1094
- for (const pkgPath of Object.values(this.packagePaths)) {
1095
- this.getPackageInfo(pkgPath) // 触发缓存写入
1096
- }
1097
- }
1098
-
1099
- // 读取(带缓存)
1100
- private getPackageInfo(pkgPath: string): PackageInfo {
1101
- const cached = this.packageCache.get(pkgPath)
1102
- if (cached) {
1103
- return cached // 缓存命中
1104
- }
1105
-
1106
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))
1107
- this.packageCache.set(pkgPath, pkg) // 写入缓存
1108
- return pkg
1109
- }
1110
- ```
126
+ # 更新指定包的小版本
127
+ mbump components minor
1111
128
 
1112
- ### 注意事项
129
+ # 批量更新所有包
130
+ mbump all
1113
131
 
1114
- 1. **内存占用**:缓存会占用一定内存,但对于大多数项目来说影响微乎其微
1115
- 2. **一致性**:如果外部工具修改了 package.json,需要手动清除缓存
1116
- 3. **线程安全**:当前实现不是线程安全的,建议在单线程环境中使用
1117
- 4. **缓存大小**:没有设置最大缓存限制,理论上可以缓存无限数量的包
132
+ # 批量更新所有包到补丁版本
133
+ mbump all patch
1118
134
 
1119
- ### 未来优化方向
135
+ # 预发布版本
136
+ mbump pre-minor
1120
137
 
1121
- - [ ] 添加 LRU 缓存策略,限制最大缓存数量
1122
- - [ ] 支持文件系统监听,自动检测文件变化并更新缓存
1123
- - [ ] 添加缓存持久化选项,跨进程共享缓存
1124
- - [ ] 提供缓存命中率统计,帮助性能分析
138
+ # 试运行模式(预览操作)
139
+ mbump components patch --dry-run
1125
140
 
1126
- ## 🧪 测试
141
+ # 更新版本并发布到 NPM
142
+ mbump components patch --npm
1127
143
 
1128
- mbump 拥有完善的测试体系,包括单元测试和集成测试,确保代码质量和功能稳定性。
144
+ # 更新版本但不推送到远程
145
+ mbump components patch --no-push
1129
146
 
1130
- ### 测试覆盖范围
147
+ # 允许未提交更改的情况下继续
148
+ mbump components patch --allow-uncommitted
1131
149
 
1132
- #### 单元测试 (Unit Tests)
1133
- - **版本计算**:验证 semver 版本递增逻辑
1134
- - ✅ **安全检查**:验证路径遍历防护、命令注入防护
1135
- - ✅ **工具函数**:验证各种辅助函数的正确性
150
+ # 详细输出模式
151
+ mbump components patch --verbose
152
+ ```
1136
153
 
1137
- #### 集成测试 (Integration Tests)
1138
- - ✅ **单包版本更新**:验证单个包的版本号更新流程
1139
- - ✅ **批量版本更新**:验证多个包同时更新的场景
1140
- - ✅ **CHANGELOG 生成**:验证 CHANGELOG.md 文件的创建和内容
1141
- - ✅ **Git Tag 管理**:验证 Git 标签的创建、前缀配置等
1142
- - ✅ **Dry-run 模式**:验证试运行模式不修改文件
1143
- - ✅ **缓存机制**:验证配置缓存和包信息缓存
1144
- - ✅ **错误处理**:验证无效包名、版本冲突等异常场景
154
+ ### 4. 路径模式详解
1145
155
 
1146
- ### 运行测试
156
+ 路径模式允许直接指定项目目录,无需配置文件:
1147
157
 
1148
158
  ```bash
1149
- # 运行所有测试
1150
- pnpm test
159
+ # 相对路径
160
+ mbump ./packages/my-pkg
161
+ mbump ../other-project
1151
162
 
1152
- # 运行特定测试文件
1153
- pnpm test tests/integration.test.ts
163
+ # 绝对路径
164
+ mbump /path/to/project
165
+ mbump C:\Projects\my-app
1154
166
 
1155
- # 监听模式(开发时使用)
1156
- pnpm test:watch
167
+ # 当前目录
168
+ mbump .
1157
169
  ```
1158
170
 
1159
- ### 测试统计
171
+ 支持的路径格式:
1160
172
 
1161
- | 测试类型 | 测试文件数 | 测试用例数 | 通过率 |
1162
- |---------|-----------|-----------|--------|
1163
- | 单元测试 | 2 | 12 | 100% ✅ |
1164
- | 集成测试 | 1 | 16 | 100% ✅ |
1165
- | **总计** | **3** | **28** | **100%** ✅ |
173
+ | 格式 | 示例 |
174
+ |------|------|
175
+ | 相对路径 | `./packages/my-pkg` |
176
+ | 上级目录 | `../other-project` |
177
+ | 绝对路径 | `/usr/local/project` |
178
+ | Windows 路径 | `C:\Projects\app` |
179
+ | 用户主目录 | `~/projects/my-app` |
180
+ | UNC 路径 | `\\server\share\project` |
1166
181
 
1167
- ### 集成测试特点
182
+ ### 5. Rust 项目模式
1168
183
 
1169
- #### 1. 隔离环境
1170
- 每个测试在临时目录中执行,避免污染真实项目:
1171
- ```typescript
1172
- beforeEach(() => {
1173
- tempDir = join(os.tmpdir(), `mbump-test-${Date.now()}`)
1174
- mkdirSync(tempDir, { recursive: true })
1175
- // 初始化 Git 仓库...
1176
- })
184
+ ```bash
185
+ # 更新当前目录 Rust 项目
186
+ mbump --rust patch
1177
187
 
1178
- afterEach(() => {
1179
- rmSync(tempDir, { recursive: true, force: true })
1180
- })
1181
- ```
188
+ # 更新指定目录的 Rust 项目
189
+ mbump ./backend -r minor
1182
190
 
1183
- #### 2. 完整工作流
1184
- 测试完整的版本更新流程:
1185
- - 创建临时 Git 仓库
1186
- - 创建 package.json 和配置文件
1187
- - 执行版本更新
1188
- - 验证结果(版本号、Git Tag、CHANGELOG)
1189
- - 清理临时文件
191
+ # 试运行模式
192
+ mbump -r major --dry-run
193
+ ```
1190
194
 
1191
- #### 3. 真实场景
1192
- 使用真实的 Git 命令和文件系统操作:
1193
- ```typescript
1194
- // 初始化 Git 仓库
1195
- execSync('git init', { cwd: tempDir })
1196
- execSync('git config user.email "test@example.com"', { cwd: tempDir })
195
+ ## ⚙️ 配置文件
1197
196
 
1198
- // 创建 commits
1199
- execSync('git add . && git commit -m "feat: feature"', { cwd: tempDir })
197
+ ### 配置文件格式
1200
198
 
1201
- // 验证 Git Tag
1202
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' })
1203
- ```
199
+ 支持多种格式,按以下顺序查找:
200
+ `.ts` `.mjs` `.js` `.cjs` `.json` `.yaml` → `.yml` → `.toml` → `package.json`
1204
201
 
1205
- ### 测试示例
202
+ ### 配置选项
1206
203
 
1207
- #### 单包更新测试
1208
204
  ```typescript
1209
- it('应该成功更新单个包的版本号', async () => {
1210
- createPackageFile('test-package', '1.0.0')
1211
- createConfigFile({ default: 'package.json' })
1212
- createInitialCommit()
205
+ import type { Config } from '@mznjs/mbump'
206
+
207
+ export default {
208
+ // 包路径配置
209
+ packagePaths: {
210
+ default: 'package.json',
211
+ components: 'packages/components/package.json',
212
+ },
1213
213
 
1214
- const manager = new VersionManager({ rootDir: tempDir })
1215
- const result = await manager.updateVersion('default', 'minor', {
214
+ // 默认选项
215
+ defaults: {
216
+ releaseType: 'patch',
1216
217
  dryRun: false,
1217
- autoCommit: true,
218
+ verbose: false,
219
+ allowUncommitted: false,
1218
220
  npm: false,
1219
- changelog: false,
1220
- })
1221
-
1222
- expect(result.success).toBe(true)
1223
- expect(result.updatedPackages[0].newVersion).toBe('1.1.0')
1224
-
1225
- const pkgContent = JSON.parse(readFileSync(join(tempDir, 'package.json'), 'utf8'))
1226
- expect(pkgContent.version).toBe('1.1.0')
1227
- })
1228
- ```
1229
-
1230
- #### Git Tag 测试
1231
- ```typescript
1232
- it('应该在版本更新后创建 Git Tag', async () => {
1233
- createPackageFile('test-package', '1.0.0')
1234
- createConfigFile({ default: 'package.json' })
1235
- createInitialCommit()
221
+ },
1236
222
 
1237
- const manager = new VersionManager({ rootDir: tempDir })
1238
- await manager.updateVersion('default', 'minor', {
1239
- dryRun: false,
223
+ // Git 选项
224
+ git: {
225
+ commitMessage: 'chore: bump version to {{newVersion}}',
226
+ push: true,
1240
227
  autoCommit: true,
1241
- npm: false,
1242
- changelog: false,
1243
228
  tag: true,
1244
- })
1245
-
1246
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' }).trim().split('\n')
1247
- expect(tags).toContain('v1.1.0')
1248
- })
1249
- ```
229
+ tagPrefix: 'v',
230
+ changelog: true,
231
+ },
1250
232
 
1251
- #### 缓存机制测试
1252
- ```typescript
1253
- it('应该预加载包信息到缓存', () => {
1254
- createPackageFile('test-package', '1.0.0')
1255
- createConfigFile({ default: 'package.json' })
1256
- createInitialCommit()
1257
-
1258
- const manager = new VersionManager({ rootDir: tempDir })
1259
- const stats = manager.getCacheStats()
1260
-
1261
- expect(stats.size).toBeGreaterThan(0)
1262
- expect(stats.packages).toContain(join(tempDir, 'package.json'))
1263
- })
233
+ // 发布选项
234
+ publish: {
235
+ command: 'pnpm publish --access public --no-git-checks',
236
+ skipChecks: true,
237
+ },
238
+ } satisfies Config
1264
239
  ```
1265
240
 
1266
- ### 持续集成
241
+ ### 配置项说明
1267
242
 
1268
- 测试已集成到 CI/CD 流程中,每次提交都会自动运行:
1269
- - ✅ 代码构建
1270
- - ✅ 类型检查
1271
- - ✅ ESLint 检查
1272
- - ✅ 单元测试
1273
- - ✅ 集成测试
243
+ #### packagePaths
1274
244
 
1275
- ## 📊 版本类型
245
+ 包路径映射,键为包名,值为 `package.json` 的相对路径(相对于配置文件所在目录)。
1276
246
 
1277
- ### 标准版本类型
1278
- - **major**: 主版本号(不兼容的 API 修改)
1279
- - **minor**: 次版本号(向下兼容的功能性新增)
1280
- - **patch**: 修订号(向下兼容的问题修正)
247
+ - `default` 键始终指向根目录的 `package.json`
248
+ - 即使不配置,系统也会自动使用 `{ default: 'package.json' }`
1281
249
 
1282
- ### 预发布版本类型
1283
- - **pre-major**: 预发布主版本
1284
- - **pre-minor**: 预发布次版本
1285
- - **pre-patch**: 预发布修订版本
1286
- - **prerelease**: 预发布版本
1287
- - **next**: 下一个预发布版本
250
+ #### defaults
1288
251
 
1289
- ### 特殊版本类型
1290
- - **conventional**: 根据 commits 自动生成版本类型
1291
- - **as-is**: 保持当前版本不变(仅更新 CHANGELOG)
1292
-
1293
- ## 🧪 测试
252
+ | 选项 | 类型 | 默认值 | 说明 |
253
+ |------|------|--------|------|
254
+ | `releaseType` | `string` | `'patch'` | 默认版本类型 |
255
+ | `dryRun` | `boolean` | `false` | 默认试运行模式 |
256
+ | `verbose` | `boolean` | `false` | 默认详细输出 |
257
+ | `allowUncommitted` | `boolean` | `false` | 允许未提交更改 |
258
+ | `npm` | `boolean` | `false` | 默认启用发布 |
1294
259
 
1295
- mbump 拥有完善的测试体系,包括单元测试和集成测试,确保代码质量和功能稳定性。
260
+ #### git
1296
261
 
1297
- ### 测试覆盖范围
262
+ | 选项 | 类型 | 默认值 | 说明 |
263
+ |------|------|--------|------|
264
+ | `commitMessage` | `string` | `'chore: bump version...'` | 提交消息模板 |
265
+ | `push` | `boolean` | `true` | 是否自动推送 |
266
+ | `autoCommit` | `boolean` | `true` | 是否自动提交 |
267
+ | `tag` | `boolean` | `true` | 是否创建 Tag |
268
+ | `tagPrefix` | `string` | `'v'` | Tag 前缀(仅主项目) |
269
+ | `changelog` | `boolean` | `true` | 是否生成 CHANGELOG |
1298
270
 
1299
- #### 单元测试 (Unit Tests)
1300
- - ✅ **版本计算**:验证 semver 版本递增逻辑
1301
- - ✅ **安全检查**:验证路径遍历防护、命令注入防护
1302
- - ✅ **工具函数**:验证各种辅助函数的正确性
271
+ #### publish
1303
272
 
1304
- #### 集成测试 (Integration Tests)
1305
- - ✅ **单包版本更新**:验证单个包的版本号更新流程
1306
- - **批量版本更新**:验证多个包同时更新的场景
1307
- - **CHANGELOG 生成**:验证 CHANGELOG.md 文件的创建和内容
1308
- - ✅ **Git Tag 管理**:验证 Git 标签的创建、前缀配置等
1309
- - ✅ **Dry-run 模式**:验证试运行模式不修改文件
1310
- - ✅ **缓存机制**:验证配置缓存和包信息缓存
1311
- - ✅ **错误处理**:验证无效包名、版本冲突等异常场景
273
+ | 选项 | 类型 | 默认值 | 说明 |
274
+ |------|------|--------|------|
275
+ | `command` | `string` | `'pnpm publish...'` | 发布命令 |
276
+ | `skipChecks` | `boolean` | `true` | 跳过安全检查 |
1312
277
 
1313
- ### 运行测试
278
+ ## 📝 命令行选项
1314
279
 
1315
- ```bash
1316
- # 运行所有测试
1317
- pnpm test
280
+ ```
281
+ 用法: mbump [package|path] [type] [options]
1318
282
 
1319
- # 运行特定测试文件
1320
- pnpm test tests/integration.test.ts
283
+ 参数:
284
+ [package] 要更新的包名称或 "all" 更新所有包
285
+ [path] 项目目录路径(支持 ./path, ../path, /path, C:\path)
286
+ [type] 版本升级类型: major, minor, patch, pre-patch, pre-minor, pre-major
1321
287
 
1322
- # 监听模式(开发时使用)
1323
- pnpm test:watch
288
+ 选项:
289
+ --dry-run, -d 试运行模式,只显示将要执行的操作
290
+ --verbose, -v 详细输出模式,显示更多执行细节
291
+ --no-commit, -n 禁用自动 Git 提交
292
+ --no-push, -p 禁用自动推送到远程仓库
293
+ --allow-uncommitted, -u 允许在有未提交更改的情况下继续操作
294
+ --npm, -N 启用 NPM/PNPM 包发布功能
295
+ --show-config, -c 显示当前加载的完整配置信息
296
+ --rust, -r 启用 Rust 项目模式
297
+ --version, -V 显示当前版本号
298
+ --help, -h 显示帮助信息
1324
299
  ```
1325
300
 
1326
- ### 测试统计
1327
-
1328
- | 测试类型 | 测试文件数 | 测试用例数 | 通过率 |
1329
- |---------|-----------|-----------|--------|
1330
- | 单元测试 | 2 | 12 | 100% ✅ |
1331
- | 集成测试 | 1 | 16 | 100% ✅ |
1332
- | **总计** | **3** | **28** | **100%** ✅ |
301
+ ## 🔌 API 使用
1333
302
 
1334
- ### 集成测试特点
303
+ ### 核心类
1335
304
 
1336
- #### 1. 隔离环境
1337
- 每个测试在临时目录中执行,避免污染真实项目:
1338
305
  ```typescript
1339
- beforeEach(() => {
1340
- tempDir = join(os.tmpdir(), `mbump-test-${Date.now()}`)
1341
- mkdirSync(tempDir, { recursive: true })
1342
- // 初始化 Git 仓库...
1343
- })
1344
-
1345
- afterEach(() => {
1346
- rmSync(tempDir, { recursive: true, force: true })
1347
- })
306
+ import { VersionManager, RustManager, GitManager, ChangelogManager } from '@mznjs/mbump'
1348
307
  ```
1349
308
 
1350
- #### 2. 完整工作流
1351
- 测试完整的版本更新流程:
1352
- - 创建临时 Git 仓库
1353
- - 创建 package.json 和配置文件
1354
- - 执行版本更新
1355
- - 验证结果(版本号、Git Tag、CHANGELOG)
1356
- - 清理临时文件
309
+ ### VersionManager
1357
310
 
1358
- #### 3. 真实场景
1359
- 使用真实的 Git 命令和文件系统操作:
1360
311
  ```typescript
1361
- // 初始化 Git 仓库
1362
- execSync('git init', { cwd: tempDir })
1363
- execSync('git config user.email "test@example.com"', { cwd: tempDir })
312
+ import { VersionManager, loadConfigAsync } from '@mznjs/mbump'
1364
313
 
1365
- // 创建 commits
1366
- execSync('git add . && git commit -m "feat: feature"', { cwd: tempDir })
1367
-
1368
- // 验证 Git Tag
1369
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' })
1370
- ```
314
+ const config = await loadConfigAsync(process.cwd())
315
+ const manager = new VersionManager({ config, rootDir: process.cwd() })
1371
316
 
1372
- ### 测试示例
317
+ // 更新版本
318
+ const result = await manager.updateVersion('my-package', 'minor', {
319
+ dryRun: false,
320
+ verbose: true,
321
+ autoCommit: true,
322
+ push: true,
323
+ })
1373
324
 
1374
- #### 单包更新测试
1375
- ```typescript
1376
- it('应该成功更新单个包的版本号', async () => {
1377
- createPackageFile('test-package', '1.0.0')
1378
- createConfigFile({ default: 'package.json' })
1379
- createInitialCommit()
325
+ // 预览更新
326
+ const preview = await manager.previewUpdate('my-package', 'patch')
1380
327
 
1381
- const manager = new VersionManager({ rootDir: tempDir })
1382
- const result = await manager.updateVersion('default', 'minor', {
1383
- dryRun: false,
1384
- autoCommit: true,
1385
- npm: false,
1386
- changelog: false,
1387
- })
1388
-
1389
- expect(result.success).toBe(true)
1390
- expect(result.updatedPackages[0].newVersion).toBe('1.1.0')
1391
-
1392
- const pkgContent = JSON.parse(readFileSync(join(tempDir, 'package.json'), 'utf8'))
1393
- expect(pkgContent.version).toBe('1.1.0')
1394
- })
328
+ // 获取包版本
329
+ const version = manager.getPackageVersion('my-package')
1395
330
  ```
1396
331
 
1397
- #### Git Tag 测试
1398
- ```typescript
1399
- it('应该在版本更新后创建 Git Tag', async () => {
1400
- createPackageFile('test-package', '1.0.0')
1401
- createConfigFile({ default: 'package.json' })
1402
- createInitialCommit()
332
+ ### RustManager
1403
333
 
1404
- const manager = new VersionManager({ rootDir: tempDir })
1405
- await manager.updateVersion('default', 'minor', {
1406
- dryRun: false,
1407
- autoCommit: true,
1408
- npm: false,
1409
- changelog: false,
1410
- tag: true,
1411
- })
334
+ ```typescript
335
+ import { RustManager } from '@mznjs/mbump'
1412
336
 
1413
- const tags = execSync('git tag', { cwd: tempDir, encoding: 'utf8' }).trim().split('\n')
1414
- expect(tags).toContain('v1.1.0')
1415
- })
1416
- ```
337
+ const rustManager = new RustManager('/path/to/rust-project')
1417
338
 
1418
- #### 缓存机制测试
1419
- ```typescript
1420
- it('应该预加载包信息到缓存', () => {
1421
- createPackageFile('test-package', '1.0.0')
1422
- createConfigFile({ default: 'package.json' })
1423
- createInitialCommit()
1424
-
1425
- const manager = new VersionManager({ rootDir: tempDir })
1426
- const stats = manager.getCacheStats()
1427
-
1428
- expect(stats.size).toBeGreaterThan(0)
1429
- expect(stats.packages).toContain(join(tempDir, 'package.json'))
339
+ // 更新版本
340
+ const result = rustManager.updateVersion('patch', {
341
+ dryRun: false,
1430
342
  })
1431
343
  ```
1432
344
 
1433
- ### 持续集成
345
+ ### GitManager
1434
346
 
1435
- 测试已集成到 CI/CD 流程中,每次提交都会自动运行:
1436
- - 代码构建
1437
- - ✅ 类型检查
1438
- - ✅ ESLint 检查
1439
- - ✅ 单元测试
1440
- - ✅ 集成测试
1441
-
1442
- ## 🎯 使用场景
347
+ ```typescript
348
+ import { GitManager } from '@mznjs/mbump'
1443
349
 
1444
- ### 场景 1: 日常开发
350
+ const gitManager = new GitManager('/path/to/project')
1445
351
 
1446
- ```bash
1447
- # 修复 bug 后发布补丁版本
1448
- mbump patch
352
+ // 检查未提交更改
353
+ const hasChanges = gitManager.hasUncommittedChanges()
1449
354
 
1450
- # 添加新功能后发布小版本
1451
- mbump minor
355
+ // 创建 Tag
356
+ await gitManager.createTag('1.0.0', 'v')
1452
357
 
1453
- # 重大重构后发布主版本
1454
- mbump major
358
+ // 提交并推送
359
+ await gitManager.commitAndPush('chore: bump version', true, true, '1.0.0', 'v')
1455
360
  ```
1456
361
 
1457
- ### 场景 2: 预发布测试
1458
-
1459
- ```bash
1460
- # 创建 beta 版本进行测试
1461
- mbump pre-minor
1462
-
1463
- # 创建 rc 版本(需要自定义)
1464
- mbump custom
1465
- # 输入: 1.0.0-rc.1
1466
- ```
362
+ ### 工具函数
1467
363
 
1468
- ### 场景 3: Monorepo 批量更新
364
+ ```typescript
365
+ import { pathUtils, semverUtils, securityUtils } from '@mznjs/mbump'
1469
366
 
1470
- ```bash
1471
- # 交互式选择每个包的版本
1472
- mbump all
367
+ // 路径工具
368
+ pathUtils.isPathLike('./packages/my-pkg') // true
1473
369
 
1474
- # 统一升级所有包的补丁版本
1475
- mbump all patch
370
+ // Semver 工具
371
+ semverUtils.incrementVersion('1.0.0', 'patch') // '1.0.1'
1476
372
 
1477
- # 试运行查看将要执行的变更
1478
- mbump all minor --dry-run
373
+ // 安全工具
374
+ securityUtils.validatePath('/project/src', '/project') // true
1479
375
  ```
1480
376
 
1481
- ### 场景 4: CI/CD 自动化
377
+ ## 🏷️ Git Tag 策略
1482
378
 
1483
- ```bash
1484
- # 在 CI 环境中自动发布
1485
- mbump components patch --npm --no-commit
1486
-
1487
- # 跳过未提交检查
1488
- mbump core minor --allow-uncommitted
1489
- ```
379
+ ### 主项目包
1490
380
 
1491
- ## 🔍 调试与诊断
381
+ - **格式**: `{tagPrefix}{version}`
382
+ - **示例**: `v1.0.1`, `release-2.0.0`
383
+ - **识别条件**: 包名为 `default` 或包路径为 `package.json`
1492
384
 
1493
- ### 查看详细日志
385
+ ### 子包
1494
386
 
1495
- ```bash
1496
- mbump components patch --verbose
1497
- ```
387
+ - **格式**: `{package-name}@{version}`
388
+ - **示例**: `@my-org/components@1.0.1`, `cli@2.3.0`
389
+ - **识别条件**: 所有非主项目包
1498
390
 
1499
- ### 查看当前配置
391
+ ### 批量更新
1500
392
 
1501
- ```bash
1502
- mbump --show-config
1503
- ```
393
+ 使用 `mbump all` 时,会为每个包创建独立的 Tag:
1504
394
 
1505
- 输出示例:
1506
395
  ```
1507
- 📋 当前加载的配置:
1508
-
1509
- 配置文件: .mbump.config.mjs
1510
-
1511
- 📦 包路径:
1512
- components: package.json
1513
- cli: packages/cli/package.json
1514
-
1515
- ⚙️ 默认选项:
1516
- releaseType: patch
1517
- dryRun: false
1518
- verbose: false
1519
- allowUncommitted: false
1520
- npm: false
1521
-
1522
- 🔧 Git 选项:
1523
- commit: true
1524
- push: true
1525
- tag: true
1526
- changelog: true
1527
-
1528
- 🚀 发布选项:
1529
- command: pnpm publish --access public --no-git-checks
1530
- skipChecks: true
1531
- ```
1532
-
1533
- ### 试运行模式
1534
-
1535
- ```bash
1536
- # 预览将要执行的操作,不实际修改文件
1537
- mbump components minor --dry-run
396
+ v1.0.1 # 主项目包
397
+ @my-org/components@1.0.1 # 子包
398
+ @my-org/cli@2.3.0 # 子包
1538
399
  ```
1539
400
 
1540
- ## 🏷️ Git Tag 策略详解
1541
-
1542
- mbump 采用智能的 Git Tag 策略,根据包的类型自动选择合适的命名格式:
1543
-
1544
- ### 主项目包 (default / root package)
401
+ ## 📋 Dry-run 模式
1545
402
 
1546
- 主项目包通常对应根目录的 `package.json`,配置为 `"default": "package.json"`。
403
+ Dry-run 模式允许预览将要执行的操作,不实际修改任何文件:
1547
404
 
1548
405
  ```bash
1549
- mbump default patch
1550
- # 或简写为
1551
- mbump patch # 如果默认包名为 default
1552
- ```
1553
-
1554
- **Tag 格式**:`{tagPrefix}{version}`
1555
- - 默认前缀:`v`
1556
- - 示例:`v1.0.1`, `v2.3.0`, `release-3.0.0`
1557
-
1558
- **行为**:
1559
- - ✅ 自动创建带注释的 Git Tag
1560
- - ✅ 推送到远程仓库(如果 `git.push = true`)
1561
- - ✅ 使用配置的 `tagPrefix`(可通过 `git.tagPrefix` 自定义)
1562
-
1563
- **自定义前缀示例**:
1564
- ```json
1565
- {
1566
- "git": {
1567
- "tagPrefix": "release-"
1568
- }
1569
- }
1570
- ```
1571
- ```bash
1572
- mbump default minor
1573
- # → 创建 Tag: release-1.1.0
406
+ mbump components patch --dry-run
1574
407
  ```
1575
408
 
1576
- ---
1577
-
1578
- ### 子包 (所有非主项目包)
1579
-
1580
- 子包包括所有在 `packagePaths` 中配置的非主项目包。
1581
-
1582
- #### 单独更新子包
409
+ 输出示例:
1583
410
 
1584
- ```bash
1585
- mbump components patch
1586
- mbump cli minor
1587
411
  ```
412
+ 🔍 Dry-run 模式 - 以下操作将被执行:
1588
413
 
1589
- **Tag 格式**:`{package-name}@{version}`
1590
- - **不使用** `tagPrefix` 配置
1591
- - 直接使用 `package.json` 中的 `name` 字段
1592
- - 为更新的包创建独立标签
1593
-
1594
- **示例**:
1595
- ```bash
1596
- mbump components patch
1597
- # 假设 components/package.json 中 "name": "@my-org/components"
1598
- # → 创建 Tag: @my-org/components@1.0.1
414
+ 📦 components
415
+ 当前版本: 1.0.0
416
+ 新版本: 1.0.1
417
+ Tag: @my-org/components@1.0.1
418
+ CHANGELOG: 是
419
+ Git Commit: 是
420
+ Git Push: 是
421
+ NPM Publish:
1599
422
 
1600
- mbump cli minor
1601
- # 假设 cli/package.json 中 "name": "@my-org/cli"
1602
- # → 创建 Tag: @my-org/cli@2.3.0
423
+ 以上为预览,未执行任何实际操作
1603
424
  ```
1604
425
 
1605
- ---
426
+ ## ⚠️ 未提交更改检测
1606
427
 
1607
- #### Monorepo 批量更新
428
+ 系统会自动检测未提交的 Git 更改,并提示用户确认:
1608
429
 
1609
430
  ```bash
1610
- mbump all
431
+ mbump components patch
1611
432
  ```
1612
433
 
1613
- **Tag 格式**:`{package-name}@{version}`
1614
- - 不使用 `tagPrefix` 配置
1615
- - 为每个更新的**子包**创建独立标签
1616
- - **主项目包**仍然使用 `{tagPrefix}{version}` 格式
1617
-
1618
- **示例**:
1619
- 假设有以下包被更新:
1620
- - `default` (主项目): 1.0.0 → 1.0.1
1621
- - `components`: 1.0.0 → 1.0.1
1622
- - `cli`: 2.2.0 → 2.3.0
1623
- - `core`: 0.5.1 → 0.5.2
434
+ 输出示例:
1624
435
 
1625
- 将创建以下 Tags:
1626
436
  ```
1627
- v1.0.1 # 主项目包,使用 tagPrefix
1628
- components@1.0.1 # 子包
1629
- cli@2.3.0 # 子包
1630
- core@0.5.2 # 子包
437
+ [warn] 警告: 检测到未提交的Git更改
438
+ ? 是否继续(dry-run模式不会实际提交更改)? Yes
1631
439
  ```
1632
440
 
1633
- **优势**:
1634
- - ✅ 清晰区分主项目和子包的版本历史
1635
- - ✅ 主项目保持简洁的 `v1.0.1` 格式
1636
- - ✅ 子包使用明确的 `{包名}@{版本号}` 格式
1637
- - ✅ 便于单独回滚某个包到特定版本
1638
- - ✅ 符合 Monorepo 最佳实践(类似 pnpm、lerna)
1639
- - ✅ 支持独立的 CI/CD 流程
1640
-
1641
- ---
1642
-
1643
- ### Git 操作示例
441
+ 使用 `--allow-uncommitted` 选项跳过确认:
1644
442
 
1645
443
  ```bash
1646
- # 查看所有 tags
1647
- git tag -l
1648
-
1649
- # 查看主项目的 tags
1650
- git tag -l "v*"
1651
-
1652
- # 查看特定子包的 tags
1653
- git tag -l "components@*"
1654
-
1655
- # 查看所有子包的 tags
1656
- git tag -l "*@*"
1657
-
1658
- # 检出主项目的特定版本
1659
- git checkout v1.0.1
1660
-
1661
- # 检出子包的特定版本
1662
- git checkout components@1.0.1
1663
-
1664
- # 推送所有 tags
1665
- git push --tags
444
+ mbump components patch --allow-uncommitted
1666
445
  ```
1667
446
 
1668
- ---
1669
-
1670
- ### 禁用 Tag 创建
447
+ ## 🛠️ 调试与诊断
1671
448
 
1672
- 如果不需要自动创建 Tag,可以在配置中禁用:
449
+ ### 查看配置
1673
450
 
1674
- ```json
1675
- {
1676
- "git": {
1677
- "tag": false
1678
- }
1679
- }
451
+ ```bash
452
+ mbump --show-config
1680
453
  ```
1681
454
 
1682
- 这将禁用所有包(包括主项目和子包)的自动 Tag 创建。
1683
-
1684
- ---
1685
-
1686
- ### 注意事项
1687
-
1688
- 1. **主项目包识别**:系统通过以下方式判断是否为主项目包:
1689
- - 包名为 `default`
1690
- - 或者包路径为 `package.json`(根目录)
455
+ ### 详细日志
1691
456
 
1692
- 2. **子包命名**:子包的 Tag 名称直接来自其 `package.json` 中的 `name` 字段,可能包含 scope(如 `@my-org/components`)
457
+ ```bash
458
+ mbump components patch --verbose
459
+ ```
1693
460
 
1694
- 3. **Tag 唯一性**:Git 要求所有 Tag 名称唯一,因此不同包即使版本号相同,也会因为包名不同而产生不同的 Tag
461
+ ### 常见错误处理
1695
462
 
1696
- 4. **批量更新行为**:使用 `mbump all` 时,所有更改会在一次 commit 中提交,然后为每个包创建独立的 Tag
463
+ | 错误 | 解决方案 |
464
+ |------|---------|
465
+ | 版本已存在 | 删除已有 Tag: `git tag -d v1.0.1` |
466
+ | Git 冲突 | 解决冲突后重新运行 |
467
+ | NPM 认证失败 | 运行 `pnpm login` 登录 |
468
+ | 包名不存在 | 检查配置文件中的 `packagePaths` |
469
+ | 路径不存在 | 确认路径正确,目录存在 |
1697
470
 
1698
- ## ⚠️ 注意事项
471
+ ## 🧪 测试
1699
472
 
1700
- 1. **Git 要求**: 确保项目在 Git 仓库中,且已配置用户信息
1701
- 2. **未提交更改**: 默认情况下,存在未提交更改时会提示确认
1702
- 3. **配置文件**: 至少需要配置 `packagePaths`,其他选项可使用默认值
1703
- 4. **Node 版本**: 需要 Node.js >= 18.0.0
1704
- 5. **包管理器**: 默认使用 pnpm 发布,可在配置中修改为 npm 或 yarn
1705
- 6. **TypeScript 配置**: `.ts` 格式需要安装 `tsx` 依赖
1706
- 7. **ES Module**: `.mjs` 格式仅支持异步加载
473
+ ```bash
474
+ # 运行所有测试
475
+ pnpm test
1707
476
 
1708
- ## 📚 更多资源
477
+ # 运行特定测试
478
+ pnpm test tests/integration.test.ts
1709
479
 
1710
- - [配置示例](./config-examples/) - 各种格式的配置文件示例
1711
- - [CHANGELOG](./CHANGELOG.md) - 版本更新历史
1712
- - [GitHub Issues](https://github.com/mznjs/mbump/issues) - 问题反馈
480
+ # 监听模式
481
+ pnpm test:watch
482
+ ```
1713
483
 
1714
484
  ## 🤝 贡献指南
1715
485
 
1716
- 欢迎为 mbump 贡献代码!请遵循以下步骤:
1717
-
1718
486
  1. Fork 本仓库
1719
487
  2. 创建特性分支 (`git checkout -b feature/amazing-feature`)
1720
488
  3. 提交更改 (`git commit -m 'Add some amazing feature'`)
@@ -1722,10 +490,10 @@ git push --tags
1722
490
  5. 开启 Pull Request
1723
491
 
1724
492
  ### 开发要求
493
+
1725
494
  - Node.js >= 18.0.0
1726
495
  - 所有测试必须通过
1727
496
  - 代码必须符合 ESLint 规范
1728
- - 新功能必须包含测试用例
1729
497
 
1730
498
  ## 📄 许可证
1731
499
 
@@ -1733,7 +501,7 @@ MIT License
1733
501
 
1734
502
  ## 👥 作者
1735
503
 
1736
- - **mznjs Team** - [GitHub](https://github.com/mznjs)
504
+ **mznjs Team** - [GitHub](https://github.com/mznjs)
1737
505
 
1738
506
  ## 🙏 致谢
1739
507
 
@@ -1745,6 +513,4 @@ MIT License
1745
513
 
1746
514
  ---
1747
515
 
1748
- **mbump** - 让版本管理更简单!🚀
1749
-
1750
- ```
516
+ **mbump** - 让版本管理更简单!🚀