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