ccgo 3.8.0

A high-performance C++ cross-platform build CLI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
# 更新日志管理

遵循 Keep a Changelog 格式和最佳实践管理 CCGO 项目更新日志的指南。

## 概览

CCGO 遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/) 原则记录更改:

- **人类可读** - 按版本和类别组织更改
- **机器可解析** - 自动化工具的结构化格式
- **Git 集成** - 从 git 历史自动生成
- **语义化版本** - 与 SemVer 版本号绑定
- **发布说明** - 发布文档的基础

## 更新日志格式

### 标准结构

```markdown
# 更新日志

本项目的所有重要更改都将记录在此文件中。

格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。

## [未发布]

### 新增
- 已添加的新功能

### 变更
- 现有功能的更改

### 弃用
- 即将在未来版本中删除的功能

### 移除
- 已删除的功能

### 修复
- 错误修复

### 安全
- 安全改进和漏洞修复

## [1.0.0] - 2024-01-15

### 新增
- 初始发布
- 跨平台 C++ 构建系统
- 支持 Android、iOS、macOS、Windows、Linux

[未发布]: https://github.com/user/project/compare/v1.0.0...HEAD
[1.0.0]: https://github.com/user/project/releases/tag/v1.0.0
```

### 更改类别

| 类别 | 说明 | 示例 |
|------|------|------|
| **新增** | 新功能 | 为 Android 添加 ARM64 支持 |
| **变更** | 对现有功能的修改 | 将 CMake 最低版本更新至 3.20 |
| **弃用** | 标记为待删除的功能 | 弃用 `--legacy-build` 标志 |
| **移除** | 已删除的功能 | 移除 Python 2 支持 |
| **修复** | 错误修复 | 修复 iOS 框架中的内存泄漏 |
| **安全** | 安全修复 | 修补 XSS 漏洞 |

## 创建更新日志

### 初始设置

```bash
# 在项目根目录创建 CHANGELOG.md
cat > CHANGELOG.md << 'EOF'
# 更新日志

本项目的所有重要更改都将记录在此文件中。

格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。

## [未发布]

### 新增
- 初始项目设置

[未发布]: https://github.com/user/project/compare/v0.1.0...HEAD
EOF
```

### 添加更改

```markdown
## [未发布]

### 新增
- Android ARM64-v8a 架构支持
- 基于 Docker 的 Windows 和 Linux 跨平台构建
- 从 git 标签自动注入版本

### 变更
- 将最低 CMake 版本从 3.18 更新至 3.20
- 改进缺少依赖的错误消息

### 修复
- 修复 iOS 框架符号可见性问题
- 解决 MinGW 构建中的 Windows DLL 导出问题
```

### 发布版本

1. **将未发布的更改移至新版本:**

```markdown
## [未发布]

## [1.2.0] - 2024-01-15

### 新增
- Android ARM64-v8a 架构支持
- 基于 Docker 的跨平台构建

### 变更
- 将最低 CMake 版本从 3.18 更新至 3.20

### 修复
- 修复 iOS 框架符号可见性问题

[未发布]: https://github.com/user/project/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/user/project/compare/v1.1.0...v1.2.0
```

2. **创建 git 标签:**

```bash
ccgo tag v1.2.0 --message "Release 1.2.0"
```

3. **更新版本链接:**

```markdown
[未发布]: https://github.com/user/project/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/user/project/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/user/project/compare/v1.0.0...v1.1.0
```

## 自动生成更新日志

### 使用 ccgo changelog

```bash
# 从 git 历史生成更新日志
ccgo changelog

# 输出到文件
ccgo changelog --output CHANGELOG.md

# 在特定版本之间
ccgo changelog --from v1.0.0 --to v2.0.0

# 包含所有提交
ccgo changelog --include-all

# 按类型分组(约定式提交)
ccgo changelog --group-by-type
```

### Git 提交解析器

CCGO 解析[约定式提交](https://www.conventionalcommits.org/zh-hans/)以自动分类:

```bash
# 提交格式:<类型>(<范围>): <主题>

feat(android): add ARM64 support       → 新增
fix(ios): resolve memory leak          → 修复
docs: update installation guide        → (文档,不在更新日志中)
chore: bump version to 1.2.0          → (维护,不在更新日志中)
refactor(core): simplify error handling → 变更
test: add unit tests for calculator    → (测试,不在更新日志中)
perf(network): optimize data transfer  → 变更(性能改进)
```

**类型映射:**

| 提交类型 | 更新日志类别 |
|---------|-------------|
| `feat` | 新增 |
| `fix` | 修复 |
| `perf` | 变更 |
| `refactor` | 变更 |
| `revert` | 变更 |
| `docs` | (不包含) |
| `style` | (不包含) |
| `test` | (不包含) |
| `chore` | (不包含) |
| `build` | (不包含) |
| `ci` | (不包含) |

### 破坏性更改

```bash
# 带破坏性更改的提交
git commit -m "feat(api)!: change function signature

BREAKING CHANGE: Calculator.add() now returns Result<int> instead of int"
```

**在更新日志中:**

```markdown
## [2.0.0] - 2024-01-15

### 变更
- **破坏性更改:** Calculator.add() 现在返回 Result<int> 而不是 int

### 迁移指南
```cpp
// 之前
int result = Calculator.add(2, 3);

// 之后
auto result = Calculator.add(2, 3);
if (result.is_ok()) {
    int value = result.value();
}
```
```

## CI/CD 集成

### GitHub Actions

```yaml
name: Update Changelog
on:
  push:
    tags:
      - 'v*'

jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0  # 完整历史用于更新日志生成

      - name: Install CCGO
        run: pip install ccgo

      - name: Generate Changelog
        run: |
          VERSION=${GITHUB_REF#refs/tags/v}
          PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")

          if [ -n "$PREV_TAG" ]; then
            ccgo changelog --from $PREV_TAG --to v$VERSION --output CHANGELOG.new.md
          else
            ccgo changelog --to v$VERSION --output CHANGELOG.new.md
          fi

      - name: Update Changelog
        run: |
          # 将新更改添加到现有更新日志之前
          cat CHANGELOG.new.md CHANGELOG.md > CHANGELOG.tmp.md
          mv CHANGELOG.tmp.md CHANGELOG.md

      - name: Commit Changelog
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add CHANGELOG.md
          git commit -m "docs: update changelog for ${GITHUB_REF#refs/tags/}"
          git push
```

### GitLab CI

```yaml
update-changelog:
  stage: deploy
  only:
    - tags
  script:
    - pip install ccgo
    - |
      VERSION=$(echo $CI_COMMIT_TAG | sed 's/^v//')
      PREV_TAG=$(git describe --tags --abbrev=0 $CI_COMMIT_TAG^ 2>/dev/null || echo "")
      ccgo changelog --from $PREV_TAG --to $CI_COMMIT_TAG --output CHANGELOG.new.md
      cat CHANGELOG.new.md CHANGELOG.md > CHANGELOG.tmp.md
      mv CHANGELOG.tmp.md CHANGELOG.md
    - |
      git config user.name "GitLab CI"
      git config user.email "ci@gitlab.com"
      git add CHANGELOG.md
      git commit -m "docs: update changelog for $CI_COMMIT_TAG"
      git push https://oauth2:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git HEAD:main
```

## 发布说明

### 生成发布说明

```bash
# 从更新日志生成发布说明
ccgo release-notes v1.2.0

# 输出:
# Release 1.2.0
#
# 新增:
# - Android ARM64-v8a 架构支持
# - 基于 Docker 的跨平台构建
#
# 变更:
# - 将最低 CMake 版本从 3.18 更新至 3.20
#
# 修复:
# - 修复 iOS 框架符号可见性问题
```

### GitHub Release 集成

```yaml
name: Create GitHub Release
on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Install CCGO
        run: pip install ccgo

      - name: Generate Release Notes
        id: release_notes
        run: |
          ccgo release-notes ${GITHUB_REF#refs/tags/} --output release_notes.md
          echo "notes_file=release_notes.md" >> $GITHUB_OUTPUT

      - name: Create GitHub Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body_path: ${{ steps.release_notes.outputs.notes_file }}
          draft: false
          prerelease: false
```

## 最佳实践

### 1. 在每个 PR 中更新更新日志

```markdown
## [未发布]

### 新增
- 功能 X (#123)
- 功能 Y (#124)

### 修复
- 功能 A 中的错误 (#125)
```

包含 PR/issue 编号以便追溯。

### 2. 编写以用户为中心的描述

```markdown
# 好
- 添加对在 Apple Silicon Mac 上原生构建的支持

# 坏
- 更新 build_macos.py 以检测 arm64 架构
```

### 3. 分组相关更改

```markdown
### Android

#### 新增
- 支持 Android 13(API 33)
- 新的 Material Design 组件

#### 修复
- Android 11 中启动时崩溃
- 后台服务中的内存泄漏

### iOS

#### 新增
- iOS 16 小部件支持
- SwiftUI 预览

#### 修复
- App Store 提交问题
```

### 4. 为破坏性更改包含迁移指南

```markdown
## [2.0.0] - 2024-01-15

### 变更
- **破坏性更改:** 将 `ccgo build-all` 重命名为 `ccgo build --all`

### 迁移指南

更新您的构建脚本:
```bash
# 之前
ccgo build-all

# 之后
ccgo build --all
```
```

### 5. 链接到文档

```markdown
### 新增
- 基于 Docker 的跨平台构建([文档](../features/docker-builds.zh.md))
- 为 `ccgo build` 命令添加新的 `--docker` 标志
```

## 更新日志工具

### changelog-cli

```bash
# 安装 changelog-cli
npm install -g changelog-cli

# 添加条目
changelog add "Added new feature" --type added

# 删除条目
changelog remove "Old entry"

# 发布版本
changelog release 1.2.0
```

### git-cliff

```bash
# 安装 git-cliff
cargo install git-cliff

# 生成更新日志
git-cliff --output CHANGELOG.md

# 为特定范围生成
git-cliff v1.0.0..v2.0.0
```

### conventional-changelog

```bash
# 安装 conventional-changelog
npm install -g conventional-changelog-cli

# 生成更新日志
conventional-changelog -p angular -i CHANGELOG.md -s

# 首次发布
conventional-changelog -p angular -i CHANGELOG.md -s -r 0
```

## CCGO 项目更新日志

### 示例

```markdown
# 更新日志

## [未发布]

### 新增
- 基于 Rust 的 CLI 重写以提高性能
- 支持 Apple Watch 和 Apple TV 平台
- 所有平台统一的归档结构

### 变更
- 从 Python argparse 迁移到 Rust clap 进行 CLI 解析

## [3.0.10] - 2024-01-15

### 新增
- Git 版本控制与自动提交 SHA 注入
- 统一的归档命名约定
- 为所有平台生成符号包

### 变更
- 通过预构建镜像改进 Docker 构建性能
- 将 Android NDK 要求更新至 r21+

### 修复
- 修复 Windows MinGW 构建符号导出
- 解决 iOS 框架代码签名问题

### 安全
- 将 OpenSSL 依赖更新至 1.1.1w

## [3.0.9] - 2023-12-01

### 新增
- 基于 Docker 的跨平台构建
- 支持 OpenHarmony 平台

### 修复
- 修复 macOS 通用二进制文件生成
- 解决 Linux RPATH 问题

[未发布]: https://github.com/zhlinh/ccgo/compare/v3.0.10...HEAD
[3.0.10]: https://github.com/zhlinh/ccgo/compare/v3.0.9...v3.0.10
[3.0.9]: https://github.com/zhlinh/ccgo/releases/tag/v3.0.9
```

## 资源

### 规范

- [Keep a Changelog]https://keepachangelog.com/zh-CN/
- [语义化版本]https://semver.org/lang/zh-CN/
- [约定式提交]https://www.conventionalcommits.org/zh-hans/

### 工具

- [changelog-cli]https://github.com/mc706/changelog-cli
- [git-cliff]https://github.com/orhun/git-cliff
- [conventional-changelog]https://github.com/conventional-changelog/conventional-changelog

### CCGO 文档

- [版本管理]../features/version-management.zh.md
- [Git 集成]../features/git-integration.zh.md
- [贡献指南]contributing.zh.md

### 社区

- [GitHub 讨论]https://github.com/zhlinh/ccgo/discussions
- [问题追踪]https://github.com/zhlinh/ccgo/issues

## 下一步

- [贡献指南]contributing.zh.md
- [版本管理]../features/version-management.zh.md
- [Git 集成]../features/git-integration.zh.md
- [CI/CD 设置]contributing.zh.md