@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/CHANGELOG.md +114 -0
- package/README.md +311 -1545
- package/dist/{chunk-Cl8Af3a2.js → chunk-DAa1jVm7.js} +4 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +376 -77
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +76 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -43
- package/dist/index.js.map +1 -1
- package/dist/{VersionManager-CwsuNWyP.js → path-Dxq6zEl-.js} +440 -49
- package/dist/path-Dxq6zEl-.js.map +1 -0
- package/package.json +3 -1
- package/dist/VersionManager-CwsuNWyP.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,1720 +1,488 @@
|
|
|
1
1
|
# mbump
|
|
2
2
|
|
|
3
|
-
企业级版本管理工具,支持单包和
|
|
3
|
+
企业级版本管理工具,支持单包和 Monorepo 场景,让版本更新变得简单高效。
|
|
4
4
|
|
|
5
5
|
## ✨ 功能特性
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
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
|
-
|
|
28
|
+
### 本地安装
|
|
955
29
|
|
|
956
|
-
```
|
|
957
|
-
|
|
958
|
-
|
|
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
|
-
#
|
|
986
|
-
mbump
|
|
41
|
+
# 升级补丁版本
|
|
42
|
+
mbump patch
|
|
987
43
|
|
|
988
|
-
#
|
|
989
|
-
|
|
990
|
-
# - 解析 JSON (10 次)
|
|
991
|
-
# - 读取配置文件 (1 次)
|
|
992
|
-
# 总计:21 次文件 I/O 操作
|
|
993
|
-
```
|
|
44
|
+
# 升级小版本
|
|
45
|
+
mbump minor
|
|
994
46
|
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
# 批量更新 10 个包
|
|
998
|
-
mbump all patch
|
|
47
|
+
# 升级主版本
|
|
48
|
+
mbump major
|
|
999
49
|
|
|
1000
|
-
#
|
|
1001
|
-
|
|
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
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
63
|
+
# 使用上级目录
|
|
64
|
+
mbump ../other-project
|
|
65
|
+
```
|
|
1022
66
|
|
|
1023
|
-
###
|
|
67
|
+
### Monorepo 项目
|
|
1024
68
|
|
|
1025
|
-
|
|
69
|
+
创建 `.mbump.config.ts` 配置文件:
|
|
1026
70
|
|
|
1027
71
|
```typescript
|
|
1028
|
-
|
|
1029
|
-
const manager = new VersionManager({ rootDir })
|
|
72
|
+
import type { Config } from '@mznjs/mbump'
|
|
1030
73
|
|
|
1031
|
-
|
|
1032
|
-
|
|
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
|
-
|
|
83
|
+
使用命令:
|
|
1036
84
|
|
|
1037
|
-
```
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
manager.clearPackageCache()
|
|
1041
|
-
}, 60000) // 每分钟清除一次缓存
|
|
1042
|
-
```
|
|
85
|
+
```bash
|
|
86
|
+
# 更新指定包
|
|
87
|
+
mbump components patch
|
|
1043
88
|
|
|
1044
|
-
|
|
89
|
+
# 更新所有包
|
|
90
|
+
mbump all
|
|
1045
91
|
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
const manager = new VersionManager({
|
|
1049
|
-
rootDir,
|
|
1050
|
-
// 未来可以添加配置选项
|
|
1051
|
-
})
|
|
92
|
+
# 试运行模式
|
|
93
|
+
mbump all minor --dry-run
|
|
1052
94
|
```
|
|
1053
95
|
|
|
1054
|
-
|
|
96
|
+
## 📖 使用方法
|
|
97
|
+
|
|
98
|
+
### 1. 指定包名或路径
|
|
1055
99
|
|
|
1056
100
|
```bash
|
|
1057
|
-
#
|
|
1058
|
-
|
|
101
|
+
# 使用包名(需要配置文件)
|
|
102
|
+
mbump <package-name> <type>
|
|
1059
103
|
|
|
1060
|
-
#
|
|
1061
|
-
|
|
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
|
-
|
|
1079
|
-
|
|
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
|
-
|
|
1089
|
-
|
|
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
|
-
|
|
1115
|
-
|
|
1116
|
-
3. **线程安全**:当前实现不是线程安全的,建议在单线程环境中使用
|
|
1117
|
-
4. **缓存大小**:没有设置最大缓存限制,理论上可以缓存无限数量的包
|
|
132
|
+
# 批量更新所有包到补丁版本
|
|
133
|
+
mbump all patch
|
|
1118
134
|
|
|
1119
|
-
|
|
135
|
+
# 预发布版本
|
|
136
|
+
mbump pre-minor
|
|
1120
137
|
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
- [ ] 添加缓存持久化选项,跨进程共享缓存
|
|
1124
|
-
- [ ] 提供缓存命中率统计,帮助性能分析
|
|
138
|
+
# 试运行模式(预览操作)
|
|
139
|
+
mbump components patch --dry-run
|
|
1125
140
|
|
|
1126
|
-
|
|
141
|
+
# 更新版本并发布到 NPM
|
|
142
|
+
mbump components patch --npm
|
|
1127
143
|
|
|
1128
|
-
|
|
144
|
+
# 更新版本但不推送到远程
|
|
145
|
+
mbump components patch --no-push
|
|
1129
146
|
|
|
1130
|
-
|
|
147
|
+
# 允许未提交更改的情况下继续
|
|
148
|
+
mbump components patch --allow-uncommitted
|
|
1131
149
|
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
- ✅ **工具函数**:验证各种辅助函数的正确性
|
|
150
|
+
# 详细输出模式
|
|
151
|
+
mbump components patch --verbose
|
|
152
|
+
```
|
|
1136
153
|
|
|
1137
|
-
|
|
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
|
-
|
|
159
|
+
# 相对路径
|
|
160
|
+
mbump ./packages/my-pkg
|
|
161
|
+
mbump ../other-project
|
|
1151
162
|
|
|
1152
|
-
#
|
|
1153
|
-
|
|
163
|
+
# 绝对路径
|
|
164
|
+
mbump /path/to/project
|
|
165
|
+
mbump C:\Projects\my-app
|
|
1154
166
|
|
|
1155
|
-
#
|
|
1156
|
-
|
|
167
|
+
# 当前目录
|
|
168
|
+
mbump .
|
|
1157
169
|
```
|
|
1158
170
|
|
|
1159
|
-
|
|
171
|
+
支持的路径格式:
|
|
1160
172
|
|
|
1161
|
-
|
|
|
1162
|
-
|
|
1163
|
-
|
|
|
1164
|
-
|
|
|
1165
|
-
|
|
|
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
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
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
|
-
|
|
1179
|
-
|
|
1180
|
-
})
|
|
1181
|
-
```
|
|
188
|
+
# 更新指定目录的 Rust 项目
|
|
189
|
+
mbump ./backend -r minor
|
|
1182
190
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
- 创建 package.json 和配置文件
|
|
1187
|
-
- 执行版本更新
|
|
1188
|
-
- 验证结果(版本号、Git Tag、CHANGELOG)
|
|
1189
|
-
- 清理临时文件
|
|
191
|
+
# 试运行模式
|
|
192
|
+
mbump -r major --dry-run
|
|
193
|
+
```
|
|
1190
194
|
|
|
1191
|
-
|
|
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
|
-
|
|
1199
|
-
execSync('git add . && git commit -m "feat: feature"', { cwd: tempDir })
|
|
197
|
+
### 配置文件格式
|
|
1200
198
|
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
```
|
|
199
|
+
支持多种格式,按以下顺序查找:
|
|
200
|
+
`.ts` → `.mjs` → `.js` → `.cjs` → `.json` → `.yaml` → `.yml` → `.toml` → `package.json`
|
|
1204
201
|
|
|
1205
|
-
###
|
|
202
|
+
### 配置选项
|
|
1206
203
|
|
|
1207
|
-
#### 单包更新测试
|
|
1208
204
|
```typescript
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
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
|
-
|
|
1215
|
-
|
|
214
|
+
// 默认选项
|
|
215
|
+
defaults: {
|
|
216
|
+
releaseType: 'patch',
|
|
1216
217
|
dryRun: false,
|
|
1217
|
-
|
|
218
|
+
verbose: false,
|
|
219
|
+
allowUncommitted: false,
|
|
1218
220
|
npm: false,
|
|
1219
|
-
|
|
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
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
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
|
-
|
|
1247
|
-
expect(tags).toContain('v1.1.0')
|
|
1248
|
-
})
|
|
1249
|
-
```
|
|
229
|
+
tagPrefix: 'v',
|
|
230
|
+
changelog: true,
|
|
231
|
+
},
|
|
1250
232
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
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
|
-
|
|
1269
|
-
- ✅ 代码构建
|
|
1270
|
-
- ✅ 类型检查
|
|
1271
|
-
- ✅ ESLint 检查
|
|
1272
|
-
- ✅ 单元测试
|
|
1273
|
-
- ✅ 集成测试
|
|
243
|
+
#### packagePaths
|
|
1274
244
|
|
|
1275
|
-
|
|
245
|
+
包路径映射,键为包名,值为 `package.json` 的相对路径(相对于配置文件所在目录)。
|
|
1276
246
|
|
|
1277
|
-
|
|
1278
|
-
-
|
|
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
|
-
|
|
1291
|
-
|
|
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
|
-
|
|
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
|
-
####
|
|
1300
|
-
- ✅ **版本计算**:验证 semver 版本递增逻辑
|
|
1301
|
-
- ✅ **安全检查**:验证路径遍历防护、命令注入防护
|
|
1302
|
-
- ✅ **工具函数**:验证各种辅助函数的正确性
|
|
271
|
+
#### publish
|
|
1303
272
|
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
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
|
-
```
|
|
1316
|
-
|
|
1317
|
-
pnpm test
|
|
280
|
+
```
|
|
281
|
+
用法: mbump [package|path] [type] [options]
|
|
1318
282
|
|
|
1319
|
-
|
|
1320
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1351
|
-
测试完整的版本更新流程:
|
|
1352
|
-
- 创建临时 Git 仓库
|
|
1353
|
-
- 创建 package.json 和配置文件
|
|
1354
|
-
- 执行版本更新
|
|
1355
|
-
- 验证结果(版本号、Git Tag、CHANGELOG)
|
|
1356
|
-
- 清理临时文件
|
|
309
|
+
### VersionManager
|
|
1357
310
|
|
|
1358
|
-
#### 3. 真实场景
|
|
1359
|
-
使用真实的 Git 命令和文件系统操作:
|
|
1360
311
|
```typescript
|
|
1361
|
-
|
|
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
|
-
|
|
1366
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1382
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1405
|
-
|
|
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
|
-
|
|
1414
|
-
expect(tags).toContain('v1.1.0')
|
|
1415
|
-
})
|
|
1416
|
-
```
|
|
337
|
+
const rustManager = new RustManager('/path/to/rust-project')
|
|
1417
338
|
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
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
|
-
|
|
1436
|
-
|
|
1437
|
-
- ✅ 类型检查
|
|
1438
|
-
- ✅ ESLint 检查
|
|
1439
|
-
- ✅ 单元测试
|
|
1440
|
-
- ✅ 集成测试
|
|
1441
|
-
|
|
1442
|
-
## 🎯 使用场景
|
|
347
|
+
```typescript
|
|
348
|
+
import { GitManager } from '@mznjs/mbump'
|
|
1443
349
|
|
|
1444
|
-
|
|
350
|
+
const gitManager = new GitManager('/path/to/project')
|
|
1445
351
|
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
mbump patch
|
|
352
|
+
// 检查未提交更改
|
|
353
|
+
const hasChanges = gitManager.hasUncommittedChanges()
|
|
1449
354
|
|
|
1450
|
-
|
|
1451
|
-
|
|
355
|
+
// 创建 Tag
|
|
356
|
+
await gitManager.createTag('1.0.0', 'v')
|
|
1452
357
|
|
|
1453
|
-
|
|
1454
|
-
|
|
358
|
+
// 提交并推送
|
|
359
|
+
await gitManager.commitAndPush('chore: bump version', true, true, '1.0.0', 'v')
|
|
1455
360
|
```
|
|
1456
361
|
|
|
1457
|
-
###
|
|
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
|
-
|
|
364
|
+
```typescript
|
|
365
|
+
import { pathUtils, semverUtils, securityUtils } from '@mznjs/mbump'
|
|
1469
366
|
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
mbump all
|
|
367
|
+
// 路径工具
|
|
368
|
+
pathUtils.isPathLike('./packages/my-pkg') // true
|
|
1473
369
|
|
|
1474
|
-
|
|
1475
|
-
|
|
370
|
+
// Semver 工具
|
|
371
|
+
semverUtils.incrementVersion('1.0.0', 'patch') // '1.0.1'
|
|
1476
372
|
|
|
1477
|
-
|
|
1478
|
-
|
|
373
|
+
// 安全工具
|
|
374
|
+
securityUtils.validatePath('/project/src', '/project') // true
|
|
1479
375
|
```
|
|
1480
376
|
|
|
1481
|
-
|
|
377
|
+
## 🏷️ Git Tag 策略
|
|
1482
378
|
|
|
1483
|
-
|
|
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
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
387
|
+
- **格式**: `{package-name}@{version}`
|
|
388
|
+
- **示例**: `@my-org/components@1.0.1`, `cli@2.3.0`
|
|
389
|
+
- **识别条件**: 所有非主项目包
|
|
1498
390
|
|
|
1499
|
-
###
|
|
391
|
+
### 批量更新
|
|
1500
392
|
|
|
1501
|
-
|
|
1502
|
-
mbump --show-config
|
|
1503
|
-
```
|
|
393
|
+
使用 `mbump all` 时,会为每个包创建独立的 Tag:
|
|
1504
394
|
|
|
1505
|
-
输出示例:
|
|
1506
395
|
```
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
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
|
-
##
|
|
1541
|
-
|
|
1542
|
-
mbump 采用智能的 Git Tag 策略,根据包的类型自动选择合适的命名格式:
|
|
1543
|
-
|
|
1544
|
-
### 主项目包 (default / root package)
|
|
401
|
+
## 📋 Dry-run 模式
|
|
1545
402
|
|
|
1546
|
-
|
|
403
|
+
Dry-run 模式允许预览将要执行的操作,不实际修改任何文件:
|
|
1547
404
|
|
|
1548
405
|
```bash
|
|
1549
|
-
mbump
|
|
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
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
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
|
-
|
|
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
|
-
|
|
428
|
+
系统会自动检测未提交的 Git 更改,并提示用户确认:
|
|
1608
429
|
|
|
1609
430
|
```bash
|
|
1610
|
-
mbump
|
|
431
|
+
mbump components patch
|
|
1611
432
|
```
|
|
1612
433
|
|
|
1613
|
-
|
|
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
|
-
|
|
1628
|
-
|
|
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
|
-
|
|
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
|
-
|
|
449
|
+
### 查看配置
|
|
1673
450
|
|
|
1674
|
-
```
|
|
1675
|
-
|
|
1676
|
-
"git": {
|
|
1677
|
-
"tag": false
|
|
1678
|
-
}
|
|
1679
|
-
}
|
|
451
|
+
```bash
|
|
452
|
+
mbump --show-config
|
|
1680
453
|
```
|
|
1681
454
|
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
---
|
|
1685
|
-
|
|
1686
|
-
### 注意事项
|
|
1687
|
-
|
|
1688
|
-
1. **主项目包识别**:系统通过以下方式判断是否为主项目包:
|
|
1689
|
-
- 包名为 `default`
|
|
1690
|
-
- 或者包路径为 `package.json`(根目录)
|
|
455
|
+
### 详细日志
|
|
1691
456
|
|
|
1692
|
-
|
|
457
|
+
```bash
|
|
458
|
+
mbump components patch --verbose
|
|
459
|
+
```
|
|
1693
460
|
|
|
1694
|
-
|
|
461
|
+
### 常见错误处理
|
|
1695
462
|
|
|
1696
|
-
|
|
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
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
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
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
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
|
-
|
|
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** - 让版本管理更简单!🚀
|