conventional-changelog-writer 版本演进全解析:从 v1 到 v9 的架构变迁与配置项深度指南
开发工具CLI文档【免费下载链接】conventional-changelogGenerate changelogs and release notes from a projects commit messages and metadata.项目地址https://gitcode.com/gh_mirrors/co/conventional-changelog点击查看免费下载本文以 packages/conventional-changelog-writer/CHANGELOG.md 为主线结合conventional-changelog-writer包的源码writers.ts、options.ts、commit.ts、context.ts 等系统梳理该包从独立仓库时期v1.x2016 年到 monorepo 化v2.0.02017 年再到 TypeScript 重写v8.0.02024 年与渲染函数替换v9.0.02026 年的完整演进史并逐项讲解当前版本的 API、CLI 用法与全部配置项。一、包定位conventional-changelog-writer 在工具链中的角色conventional-changelog-writer是 conventional-changelog 生态中负责把结构化 commit 数据渲染成 Markdown 变更日志的核心渲染层。它的上游是conventional-commits-parser把原始 commit message 解析成结构化对象下游则是直接生成CHANGELOG.md文本。README 对其功能的描述只有一句话——Write logs based on conventional commits and templates基于 Conventional Commits 与模板编写日志但整个包的能力远不止于此提供流式、异步迭代器、整串三种使用形态见 writers.ts内置 commit 分组、排序、日期格式化、revert 过滤、上下文推导等默认逻辑支持通过transform、generateOn、template、各 partial 渲染函数实现完全定制化输出附带一个可直接消费行分隔 JSONLDJSON的 CLI 工具。二、版本演进主线从模板字符串到渲染函数CHANGELOG.md 记录了从 v0.42015 年到 v9.2.12026 年的完整历史。以下是决定架构走向的几个关键节点2.1 独立仓库时期v1.x2016 年v1.0.02016-02-05首个正式发布。此前的 v0.x 阶段奠定了核心概念doFlush、generateOn、notes、transform等选项已具雏形。v1.1.0generate时把originalCommits作为最后一个参数传入。v1.4.0/v1.4.1context 在repoUrl存在时自动回退并使用它做引用链接auto link references。2.2 并入 monorepo 与 2.0.0 大重构2017 年v2.0.0 是第一个里程碑式破坏性版本CHANGELOG 中列出的变更揭示了当时的设计决策context.host不再能改变context.linkReferences的默认值——如果 host 未知context.host为undefined所有链接将直接使用context.repositorycloses更名为referencesnotes对象从键值对象改为数组每个 note 形如{ title: BREAKING AMEND, text: some breaking change }options.replacements更名为options.map且可以接受函数commitGroupsCompareFn→commitGroupsSort、commitsCompareFn→commitsSort、noteGroupsCompareFn→noteGroupsSort、notesCompareFn→notesSortversion不再是必需字段移入context对象若最后一个 commit 中带版本号会覆盖它默认排序函数从按字典序改为localeCompareoptions.hashLength、options.maxSubjectLength、options.map被废弃统一收进options.transformcontext暴露finalizeContext允许在最后阶段修改 context。2.3 统一版本节奏期v3-v72018-2023 年v3.0.02018-01-29重构 release 标题生成逻辑所有标题层级统一为##h2patch 版本标题用small包裹以保持视觉层级目的是更好地兼容屏幕阅读器与 Markdown 解析器对应 issue #214。v4.0.02018-05-29从 header 模板中移除锚点标签并明确建议消费者使用版本对应的完整 release 页面 URLpermalink而非依赖可能不存在的锚点。v5.0.02020-12-30排序时不再支持嵌套对象属性nested object properties并移除compare-func依赖使排序结果在不同 Node 版本间保持一致。v6.0.02023-06-06要求 Node 14并尽可能从依赖中移除 lodash。v7.0.02023-08-26要求 Node 16使用Intl.DateTimeFormat替代dateformat统一各 preset 的接口preset 均导出配置工厂函数transform异步处理器得到修复。2.4 TypeScript 重写与 ESM 化v8.0.02024 年v8.0.0 是近年来影响最大的一次破坏性发布重写为 TypeScriptPR #1150conventional-changelog-writer与conventional-commits-filterPR #1178同步 TS 化除gulp-conventional-changelog外所有包均为 ESM-onlyPR #1144从 CommonJS 迁移要求Node 18新增formatDate选项PR #1189关闭 issue #1186与timeZone选项PR #1162修复了 Date 对象防修改逻辑PR #1285preventModifications的 Proxy 在 getter 中遇到Date实例时直接返回原值避免把 Date 包进不可变代理导致格式化失败见 commit.ts8.1.0 起transformCommit方法与相关 utils 被加入导出PR #13508.2.0 新增skip选项可在写 changelog 时跳过指定 commitPR #1346关闭 issue #1179 与 #3428.3.0 统一各 preset 的换行格式并从simple-libs引入工具函数8.4.0 把 hbs 模板内联为代码字符串。2.5 v9.0.0渲染函数取代 Handlebars2026 年v9.0.0 是当前最新的大版本两项破坏性变更直接重塑了定制方式Handlebars 模板字符串与 partial 文件被替换为渲染函数render functionsPR #1477template、headerPartial、commitPartial、footerPartial、preamblePartial不再是 hbs 字符串而是接收 context 并返回字符串或 Promise 的函数见 types/options.ts 中TemplateFunction的定义。要求 Node.js 22 或更新版本PR de5e136。v9.1.0 支持 changelog 前言的 partialpreamblePartialPR #1491v9.2.0 把 CLI 参数解析从meow换成argue-cliPR #1505v9.2.1 修复了 host URL 路径拼接问题PR #1534关闭 issue #986。三、当前版本 API三种调用形态conventional-changelog-writer对外暴露三种写入方式实现于 writers.ts3.1writeChangelogString最直接的整串输出README 给出的最小示例即此形态。输入是conventional-commits-parser解析后的 commit 数组输出是完整 changelog 字符串import { writeChangelogString } from conventional-changelog-writer // commits parsed by conventional-commits-parser const commits [/* ... */] const context { version: 1.0.0, host: https://github.com, owner: conventional-changelog, repository: conventional-changelog } console.log(await writeChangelogString(commits, context)) /* ## 1.0.0 (2015-05-29) ### Features * **ng-list:** Allow custom separator ([13f3160](https://github.com/...)) ... */其实现writers.ts只是对异步迭代器形态做拼接累加底层仍是writeChangelog。3.2writeChangelog异步生成器async generator返回一个(commits) AsyncGeneratorstring函数逐个 yield 每个版本区块的 changelog 文本。第三个参数includeDetails为true时yield 的不再是纯字符串而是DetailsCommit对象export interface DetailsCommit extends CommitKnownProps CommitKnownProps { log: string keyCommit: Commit | null }见 types/index.ts——log是渲染结果keyCommit是触发本区块生成的关键 commit通常是携带版本号的提交。3.3writeChangelogStreamTransform 流Transform.from(writeChangelog(...))一行代码把生成器包装成 Node.js Transform 流writers.ts便于与pipeline、stdin/stdout等流式场景组合。3.4 核心工作流从 writers.ts 的生成器实现可以还原完整处理流水线getFinalOptions(options)合并默认选项见下节getFinalContext(context, finalOptions)推导最终 context对每个 commit 调用transformCommit(chunk, transform, finalContext, finalOptions)——先经preventModifications包裹为不可变代理再交给 transform 函数返回值patch与原始 commit 合并并把raw指向原始 commitcommit.ts若skip?.(keyCommit)返回 true则跳过该 commitgenerateOn(keyCommit, commitsGroup)判定是否该生成一个 changelog 区块默认实现是commit.version 是合法 semver 时生成见 options.ts命中的 commit 累积到commitsGroup由createTemplateRenderer渲染出文本块最终按doFlush/reverse语义决定是否 yield。注意reverse语义正常顺序是时间倒序最新在前reverse: true则按时间正序处理——对应 types 注释normal order means reverse chronological order。四、配置项全解析Options Reference当前版本的完整配置项定义在 types/options.ts默认值在getFinalOptionsoptions.ts中集中给出。下表是全部可配置项配置项类型默认值说明groupBykeyof Committype按哪个字段对 commit 分组设为 falsy 则不分组commitsSort字段名 | 字段名数组 | 比较函数headercommit 组内排序falsy 则不排序commitGroupsSort同上无分组之间的排序notesSort同上textnote 的排序noteGroupsSort同上titlenote 分组的排序ignoreRevertedbooleantrue是否忽略被 revert 的 commit借助conventional-commits-filter的filterRevertedCommitsSync见 context.tsreversebooleanfalsetrue 时按时间正序chronological处理doFlushbooleantrue是否把最后一段可能为空的commit 冲刷输出从 v0.5.0 引入transform函数defaultCommitTransform变换 commit返回 patch 对象与原始 commit 合并返回 falsy 值则该 commit 被忽略generateOn函数 | 字段名 |nullcommit Boolean(semverValid(commit.version))判定何时生成 changelog 区块字符串形式表示该字段存在即生成非函数非字符串则永不生成见 options.tstemplate渲染函数内置 template把准备好的 context 渲染成文本v9 起为函数而非 hbs 字符串headerPartial渲染函数内置渲染 release 标题preamblePartial渲染函数内置渲染 release 标题之后的引言文本v9.1.0 新增支持commitPartial渲染函数内置渲染单条 commit 条目footerPartial渲染函数内置渲染 release 底部 notesfinalizeContext函数恒等函数渲染前最后一次修改 context 的机会接收(context, options, filteredCommits, keyCommit, commits)debug(message) voidnoop输出调试信息默认会打印最终 contextYour final context is: ...见 context.tsformatDate(date) stringyyyy-mm-dd格式v8.0.0 新增默认实现取toISOString().slice(0, 10)见 utils.tsskip(commit) boolean无v8.2.0 新增返回 true 则跳过该 commit 的写入几个容易忽略的实现细节排序统一走createComparator字符串字段名会被编译成(a[key] || ).localeCompare(b[key] || )字段名数组则逐字段拼接后比较也可直接传自定义比较函数utils.ts。这正是 v5.0.0 起不再支持嵌套对象属性的原因。默认 transform 的裁剪行为defaultCommitTransform会把 hash 截断为前 7 位、header 截断为前 100 个字符并用formatDate格式化committerDate注意用的是 committerDate 而非 authorDate这一约定自 v2.0.0 起确立见 options.ts。linkReferences 的自动推导只要linkReferences不是显式 boolean、且同时存在repository/repoUrl与commit/issue就会自动置为 truecontext.ts这是 v0.4.1/v1.4.x 时期linkReferences 与 host 无关这一破坏性变更的延续。isPatch推断若 context.version 是合法 semver会据此推导isPatchsemver.patch(version) ! 0见 context.ts。版本号非必需version不是必需字段v2.0.0 起移入 context若 keyCommit 上带版本号会覆盖 context 中的版本——这与generateOn的默认 semver 判定共同支撑一个 commit 对应一个 release 区块的模型。五、CLI 使用指南包内自带 CLI 入口src/cli/index.ts可直接消费行分隔 JSON 文件或 stdinUsage conventional-changelog-writer path [path ...] cat path | conventional-changelog-writer Example conventional-changelog-writer commits.ldjson cat commits.ldjson | conventional-changelog-writer Options -c, --context A filepath of a json that is used to define template variables -o, --options A filepath of a javascript object that is used to define options参数解析由argue-cli完成v9.2.0 起替换原meow-c, --context指向一个 JSON 文件内容作为模板变量context-o, --options指向一个 JavaScript 对象文件.json或可导入的模块loadDataFile依据扩展名决定JSON.parse还是动态import见 cli/utils.ts位置参数为 commit 文件列表每个文件按JSON.parse解析单条 commit 对象若未提供且 stdin 非 TTY则从 stdin 按 LDJSON 流式读取parseJsonStream。内部实现通过pipeline(inputStream, writeChangelog(context, options), process.stdout)把解析流、生成器与 stdout 串起来任何错误都会打印并process.exit(1)。测试夹具中的 commits.ldjson 与 context.json 可直接作为 CLI 输入的参考样例。六、配套测试与验证包的测试覆盖了以上全部行为可在仓库中直接查阅writers.spec.ts验证三种 API 的输出、includeDetails、doFlush、reverse等生成语义commit.spec.ts验证 transform 的异步处理、falsy 返回值忽略 commit、不可变代理包括 Date 特殊处理等context.spec.ts 与 options.spec.ts见 utils.spec.ts验证分组、排序、日期格式化、比较器编译template.spec.ts验证渲染函数模板与 partial 的组合CLI 相关测试见 cli/index.spec.ts。七、迁移要点与实战建议针对 CHANGELOG 中列出的各破坏性变更升级到 v9 时需注意Node 版本v9 要求 Node 22v8 要求 Node 18v7 要求 Node 16按需选择匹配版本ESM-onlyv8 起包只能通过import使用CommonJS 项目需改用动态import()或升级构建模板改写v9 起把 hbs 字符串模板含 partial 文件改写为渲染函数——这是迁移工作量最大的部分函数签名均为(context) string | Promisestring排序与选项名v5 起排序不再支持嵌套属性、按localeCompare比较v2 起的commitsSort/commitGroupsSort/notesSort/noteGroupsSort命名沿用至今不要使用旧的*CompareFn命名定制入口收敛hashLength/maxSubjectLength/map等旧选项早已废弃统一在transform内实现需要按 commit 粒度过滤请用skipv8.2.0需要整体跳过 revert 提交请保持ignoreReverted: true。从 v0.4 到 v9.2.1 的十年演进中conventional-changelog-writer经历了模板字符串 → 内联 hbs → 渲染函数的模板机制迭代、CJS → ESM的模块体系迁移、JS → TypeScript的类型化改造以及依赖面的持续瘦身移除 lodash、compare-func、meow。理解这份 CHANGELOG等于同时掌握了该包全部配置项的来历、默认值与最佳实践。赞分享开发工具CLI文档【免费下载链接】conventional-changelogGenerate changelogs and release notes from a projects commit messages and metadata.项目地址https://gitcode.com/gh_mirrors/co/conventional-changelog点击查看免费下载相关推荐从 v1 到 v6next-forge 版本演进全解析Changelog 深度导读从 v1 到 v6next forge 版本演进全解析Changelog 深度导读 本篇以 next forge 仓库的 CHANGELOG.md htt前端后端示例工程CLIhighlight.js 版本演进全解析从 CHANGES.md 解读 v9 到 v11 的架构变迁与升级路径highlight.js 版本演进全解析从 CHANGES.md 解读 v9 到 v11 的架构变迁与升级路径 本文以开源仓库 highlight.js ht前端Ionic Framework ionic/core 版本演进全解从 v6 到 v9 的 CHANGELOG 深度导读Ionic Framework ionic/core 版本演进全解从 v6 到 v9 的 CHANGELOG 深度导读 本篇技术指南以开源仓库 gh_mir前端移动开发跨平台上一篇如何优化Doom3.gpl的内存管理与资源加载开发者必看的终极指南下一篇Whisper.cpp终极指南高性能离线语音识别的颠覆性解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TensorRT Model Optimizer高级技巧:自定义量化策略与性能调优指南

TensorRT Model Optimizer高级技巧:自定义量化策略与性能调优指南

TensorRT Model Optimizer高级技巧:自定义量化策略与性能调优指南 【免费下载链接】Model-Optimizer A unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc…

2026/9/25 3:48:00 阅读更多 →
大鱼营销解析行业内知名谷歌SEO服务商如何选择

大鱼营销解析行业内知名谷歌SEO服务商如何选择

引言:出海浪潮下,谷歌SEO服务商选择成关键命题在全球化数字营销浪潮中,谷歌SEO已成为中国企业开拓海外市场、实现品牌破圈的核心抓手。然而,面对市场上良莠不齐的服务商,如何筛选出真正具备技术实力与实战经验的合作伙…

2026/9/25 3:46:59 阅读更多 →
从“我就位了”到系统就绪:初始化与状态管理原理剖析

从“我就位了”到系统就绪:初始化与状态管理原理剖析

您好,我已经就位。请按照以下格式提供您的项目信息,我将基于这些内容生成一篇独立、完整的深度博文:项目标题: [标题] 项目正文: [通常比较零散、不完整的原始描述,可以是任意领域内容] 关键词: [关键词1, 关键词2, ...] 摘要描述…

2026/9/25 3:46:59 阅读更多 →

最新新闻

机械臂避障路径规划仿真:从算法选型到跑通第一个场景

机械臂避障路径规划仿真:从算法选型到跑通第一个场景

简介:这份资源是面向机器人学学习者与机械臂控制方向研究者的避障路径规划仿真程序包,聚焦多自由度机械臂在三维复杂环境中从起点安全、高效抵达目标点并规避障碍这一核心问题,适合具备一定路径规划基础、希望动手验证算法的中高级学习者。压…

2026/9/25 4:34:31 阅读更多 →
编带烧录机保养与故障排查实战指南:提升产线稼动率

编带烧录机保养与故障排查实战指南:提升产线稼动率

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:34:31 阅读更多 →
ISO11898与SAE J1939协议区别详解:从CAN总线分层到抓包实战

ISO11898与SAE J1939协议区别详解:从CAN总线分层到抓包实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:34:31 阅读更多 →
Win11桌面图标失效原因与三重控制层解析

Win11桌面图标失效原因与三重控制层解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:34:31 阅读更多 →
温度检测控制仿真系统:从建模到PID整定的完整实战

温度检测控制仿真系统:从建模到PID整定的完整实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:34:31 阅读更多 →
rsuite Animation 组件实战指南:Fade、Collapse、Bounce、Slide 与自定义 Transition 动画

rsuite Animation 组件实战指南:Fade、Collapse、Bounce、Slide 与自定义 Transition 动画

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 rsuite 的 Animation 是一组开箱即用的动画组件集合,用于为元素的显示与隐藏赋予平滑的过渡…

2026/9/25 4:33:30 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →