尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Yew 项目 changelog 生成器深度解析:从 test_base.md 测试夹具到自动化版本发布流水线
Yew 项目 changelog 生成器深度解析从 test_base.md 测试夹具到自动化版本发布流水线【免费下载链接】yewRust / Wasm framework for creating reliable and efficient web applications项目地址: https://gitcode.com/gh_mirrors/ye/yew导读tools/changelog/tests/test_base.md是 Yew 仓库中 changelog 生成工具的测试基线文件它看似只是一个测试夹具实则完整承载了 Yew 维护团队为自动化版本发布release设计的一套 changelog 模板约定从标题与迁移指南链接到## ✨ package version *(date)*版本区块再到 Fixes/⚡️ Features分类与- message. [user, #issue]条目格式。本文将围绕该文件展开结合 tools/changelog 工具源码CLI 参数解析、git 提交遍历、GitHub issue 标签抓取、条目格式化与文件合并以及配套测试 generate_yew_changelog_file.rs完整还原 Yew 自动化 changelog 的生成原理并给出可直接复用的运行与测试方法。一、认识 test_base.md它是什么、为何存在1.1 文件定位test_base.md位于 tools/changelog/tests/与两个文件构成一组完整的测试三角文件作用test_base.md基线夹具模拟已发布的历史 changelog 内容作为生成前的起点test_expected.md期望输出完整描述了生成器两次运行后 changelog 应有的最终形态generate_yew_changelog_file.rs集成测试实际运行工具两次逐行断言结果与期望一致三者的关系是测试先将test_base.md复制为tests/test_changelog.md随后调用 CLI 两次向文件头部插入新版本区块最后把生成结果与test_expected.md逐行比对。因此test_base.md实质上定义的是增量生成prepend 模式下changelog 文件的既有历史部分应有的格式。1.2 文件的真实内容构成打开 test_base.md 可以看到四个格式要素它们同时也是write_version_changelog.rs新版本区块生成器与write_changelog_file.rs文件合并器必须共同遵守的格式契约第一行# Changelog全文一级标题第三行[Link to all migration guides](https://yew.rs/docs/category/migration-guides)指向迁移指南的固定链接新生成的版本区块也总是包含它## ✨ yew **0.19.0** *(2021-11-26)*版本区块标题包含包名、版本号与发布日期#### Changelog及其下的- #### Fixes/- #### ⚡️ Features历史条目每条格式为- 描述。 [作者, #PR号]。值得注意test_base.md中的历史区块使用#### Changelog嵌套结构而新生成区块见test_expected.md使用### Fixes扁平结构——这一差异正是由write_version_changelog.rs的固定模板决定的详见下文第三节测试期望文件因此保留了新旧两种形态的共存。二、changelog 生成器的整体架构与运行入口2.1 CLI 入口与参数工具入口在 tools/changelog/src/main.rs仅两行逻辑Cli::parse().run()。完整的参数定义在 tools/changelog/src/cli.rs基于clap派生参数类型默认值说明package位置参数—目标包名如yew、yew-agent、yew-router、yew-linknew_version_level位置参数—新版本级别patch、minor、majorfrom可选参数无起始 refcommit hash 或refs/tags/yew-v0.19.3提供时覆盖版本级别参数-r, --to可选参数HEAD结束 ref-f, --changelog-path可选参数../CHANGELOG.mdchangelog 文件路径-s, --skip-file-write开关false跳过写文件只输出到 stdout-b, --skip-get-bump-version开关false跳过自动获取最新版本与 bump 计算需要显式传from-t, --token可选参数无GitHub token用于 API 调用Cli::run()的主流程见 cli.rs分为五步解析包标签通过package.as_labels()取得该包在 GitHub issue 上对应的 area 标签确定版本与 from ref若skip_get_bump_version则直接用0.0.0与传入的from否则调用get_latest_version获取最新 tag再由new_version_level.bump()计算下一版本默认 from 为refs/tags/{package}-v{latest_version}遍历提交create_log_lines(from_ref, to, package_labels, token)收集每条相关提交三路分类先按is_breaking_change分出破坏性变更再在剩余条目中按消息是否包含fix分为 Fixes 与 Features输出分别经write_changelog_file写入文件与stdout_tag_description_changelog输出到 stdout用于 Git tag 描述。2.2 测试如何驱动 CLI在 generate_yew_changelog_file.rs 中测试直接构造Cli结构体而非走命令行解析let cli_args Cli { package: YewPackage::from_str(yew).unwrap(), new_version_level: NewVersionLevel::Minor, from: Some(from.to_string()), to: to.to_string(), changelog_path: tests/test_changelog.md.to_string(), skip_file_write: false, skip_get_bump_version: true, token: None, }; cli_args.run().unwrap();关键点是skip_get_bump_version: true测试刻意跳过 GitHub 版本查询使生成的版本号固定为0.0.0见cli.rs中Version::parse(0.0.0)从而让断言不依赖真实 tag。测试用两个固定的 commit hash 区间调用工具两次对应test_expected.md中两个0.0.0版本区块最终逐行比对let lines expected_reader_lines.zip(after_reader_lines); for (i, (expected_line, after_line)) in lines.enumerate() { if i 4 || i 15 { // 这两行含动态日期用当前 UTC 日期替换占位符后再断言 let expected_line_updated expected_line?.replace( date_goes_here, Utc::now().format(%Y-%m-%d).to_string().as_str(), ); assert_eq!(expected_line_updated, after_line?); } else { assert_eq!(expected_line?, after_line?); } }test_expected.md中的date_goes_here占位符正是为此设计第 5 行与第 16 行是两次生成的版本区块日期行测试会将其替换为Utc::now()格式化的当天日期再比较其余行则严格相等。测试结束前通过FileDeleteOnDrop的Drop实现自动删除临时文件tests/test_changelog.md。三、版本区块的生成规则test_base.md 格式契约的新版本一侧test_base.md 定义了历史侧格式而新版本区块的形态由 write_version_changelog.rs 固定生成两者共同构成完整契约。write_changelog_file函数输出# Changelog [Link to all migration guides](https://yew.rs/docs/category/migration-guides) ## ✨ yew **0.0.0** *(2026-09-18)* ### Fixes - ...条目... ### ⚡️ Features - ...条目... ### Breaking changes - ...条目...实现要点版本号next_version由Version类型格式化发布日期用chrono::Utc::now().format(%Y-%m-%d)取当天 UTC 日期三个分类小节### Fixes/### ⚡️ Features/### Breaking changes仅在对应列表非空时输出若三者为空则输出一行No changes该逻辑同样存在于 stdout 版本 stdout_tag_description_changelog.rs 中。条目本身的格式化逻辑在 write_log_lines.rs每行- {message}. [[{user}](https://github.com/{user_id}), [#{issue_id}](https://github.com/yewstack/yew/pull/{issue_id})]这与test_base.md中历史条目的- Attempt to fix recursion on display. [mibes, #2149]格式完全一致——新老区块因此能无缝拼接。四、文件合并策略向 changelog 头部增量插入生成新版本区块后write_changelog_file.rs 执行关键的合并操作。其策略是打开旧的 changelog 文件用BufReader逐行读取创建path.new临时文件先写入刚生成的新版本区块读取旧文件时调用.skip(4)跳过前 4 行即# Changelog标题行、空行、迁移指南链接行、空行把剩余的历史内容追加到新区块之后删除旧文件并rename临时文件为正式文件。这与test_base.md的场景完全对应test_base.md的第一行是# Changelog、第三行是迁移指南链接测试运行工具后这两行标题与链接被新生成区块中的同名内容替代历史条目则全部保留在新区块下方——这正是 test_expected.md 中两个0.0.0区块 一个0.19.0历史区块依次排列的原因。代码注释// The .skip skips the title and link to the migration guide也直接印证了这一设计意图。五、数据从何而来git 提交与 GitHub issue 标签的联动test_base.md 中的每条[user, #PR]并非手写而是从 git 历史 GitHub issue 标签实时推导的5.1 提交遍历create_log_lines.rs使用git2打开仓库Repository::open_from_env()对from与to两个 ref 分别执行revparse_single得到 OID然后let mut revwalk repo.revwalk()?; revwalk.set_sorting(Sort::TOPOLOGICAL)?; revwalk.hide(from_oid)?; revwalk.push(to_oid)?;即从to开始、隐藏from不含 from 本身进行拓扑排序遍历对每个 commit 调用create_log_line提取信息。5.2 单条提交解析create_log_line.rs对每个 commit取提交信息第一行作为message用正则\s*\(#(\d)\)捕获消息尾部的 PR/issue 编号若缺失则打印Missing issue for commit并跳过通过作者邮箱过滤机器人提交邮箱含dependabot或github-action的直接跳过调用GitHubUsersFetcher将作者名映射为 GitHub 用户 ID调用GitHubIssueLabelsFetcher抓取该 issue 的标签列表若标签中存在package_labels如yew包对应[A-yew, A-yew-macro, macro]见 yew_package.rs才认为该提交属于本包若标签包含 breaking change不区分大小写则is_breaking_change true。最终每条有效提交被封装为 log_line.rs 中的LogLinepub struct LogLine { pub message: String, pub user: String, pub user_id: String, pub issue_id: String, pub is_breaking_change: bool, }5.3 三路分类cli.rslet (breaking_changes, filtered_log_lines) log_lines .into_iter() .partition(|log_line| log_line.is_breaking_change); let (fixes, features) filtered_log_lines .into_iter() .partition(|filtered_log_line| { filtered_log_line.message.to_lowercase().contains(fix) });即破坏性变更优先独立成组其余条目中消息含fix的归入 Fixes否则归入 Features。这也解释了test_expected.md中Fix defaulted type parameter.出现在### Fixes、而Silence some warnings...出现在### ⚡️ Features的原因。六、版本 bump 规则与包标签体系6.1 版本升级new_version_level.rsNewVersionLevel支持patch/minor/major三档其bump方法在 semver 版本上递增对应位并清零低位数Patchpatch 1Minorminor 1, patch 0Majormajor 1, minor 0, patch 0。6.2 包标签映射yew_package.rsYewPackage枚举yew、yew-agent、yew-router、yew-linkkebab-case 序列化各自映射一组 GitHub area 标签包标签yewA-yew,A-yew-macro,macroyew-agentA-yew-agentyew-routerA-yew-router,A-yew-router-macroyew-linkA-yew-link,A-yew-link-macro若某 issue 的标签既不属于目标包、也非A-*/documentation/meta工具会打印Potentially invalidly labeled issue警告提示维护者重新打标签——这是保证 changelog 数据质量的自检机制。七、运行与测试如何复现 changelog 生成7.1 运行集成测试test_base.md所在的测试位于 tools/changelog/tests/generate_yew_changelog_file.rs。运行前需注意该测试通过git2解析两个固定的 commit hashabeb8bc...与d8ec50...、8086a73...与934aedb...因此必须在包含这些提交历史的仓库 clone 中运行当前镜像仓库即满足条件测试会调用 GitHub API 获取 issue 标签与用户信息因此需要网络连接仓库根目录的 Makefile.toml 定义了相关任务编排cargo-make可按其中的任务名执行对应测试测试生成的中间文件tests/test_changelog.md由FileDeleteOnDrop自动清理。进入tools/changelog目录后执行cargo test --test generate_yew_changelog_file若断言失败比对 test_expected.md 即可定位格式差异。7.2 手动运行 CLI 生成 changelog针对实际发布流程可在仓库根目录执行changelog 默认路径为../CHANGELOG.md即仓库根目录的 CHANGELOG.md# 自动推导从 yew 最新 tag 到 HEAD按 minor 级别 bump 版本 cargo run --bin changelog -- yew minor # 指定区间与 tokenrelease 场景推荐 cargo run --bin changelog -- yew minor -r refs/tags/yew-v0.19.3 -t GITHUB_TOKEN # 仅输出到 stdout用于 Git tag 描述不写文件 cargo run --bin changelog -- yew minor -s7.3 工具与仓库其他模块的关联该工具是 Yew 仓库自动化发布链路的一环生成的 stdout 文本可粘贴为 GitHub release tag 描述而仓库根目录 CHANGELOG.md 与 release.toml 是同一发布流程的不同产物各包自身的发布说明可见于 yew-agent、yew-router 等包目录仓库还有配套的 collect-release-info 与 process-benchmark-results 等发布/基准工具共同支撑版本迭代流程。八、小结tools/changelog/tests/test_base.md绝不是一段无意义的测试残留而是 Yew changelog 格式约定在历史侧的具象化它与 write_version_changelog.rs新版本侧模板、write_changelog_file.rs头部增量合并、create_log_lines.rs 与 create_log_line.rsgit GitHub issue 数据推导以及 generate_yew_changelog_file.rs端到端验证共同构成一套完整、可测试、可复用的发布 changelog 自动化方案。理解这张格式契约既能读懂 Yew 的版本发布流水线也能直接借鉴其夹具 期望文件 端到端断言的测试思路迁移到任何需要自动生成发布说明的 Rust 项目中。【免费下载链接】yewRust / Wasm framework for creating reliable and efficient web applications项目地址: https://gitcode.com/gh_mirrors/ye/yew创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

BiliBiliToolPro|B站自动签到、多账号批量管理,配一次跑一年

BiliBiliToolPro|B站自动签到、多账号批量管理,配一次跑一年

BiliBiliToolPro|B站自动签到、多账号批量管理,配一次跑一年 【免费下载链接】BiliBiliToolPro B 站(bilibili)自动任务工具,支持docker、青龙、k8s等多种部署方式。全面拥抱AI。敏感肌也能用。 项目地址: https://g…

📅 2026/9/19 5:23:09
PyTorch QAT实战:从准备到导出的完整链路与踩坑指南

PyTorch QAT实战:从准备到导出的完整链路与踩坑指南

量化感知训练(QAT)这件事,我前前后后在生产项目里落地过四五次,从最早的PyTorch 1.2时代一路踩坑踩到现在的2.x版本。说实话,第一次做QAT的时候我以为就是加个torch.quantization的API调用,结果模型精度掉了…

📅 2026/9/19 5:23:09
OpenDesign Colorful 设计系统实战指南:高对比鲜艳配色的 Token 体系与组件落地

OpenDesign Colorful 设计系统实战指南:高对比鲜艳配色的 Token 体系与组件落地

OpenDesign Colorful 设计系统实战指南:高对比鲜艳配色的 Token 体系与组件落地 【免费下载链接】open-design 🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. &#x…

📅 2026/9/19 5:23:09
MORE NEWS

更多资讯

📰

如何用 Gyroflow 免费消除视频抖动:完整陀螺仪防抖指南

如何用 Gyroflow 免费消除视频抖动:完整陀螺仪防抖指南 【免费下载链接】gyroflow Video stabilization using gyroscope data 项目地址: https://gitcode.com/GitHub_Trending/gy/gyroflow Gyroflow 是一款免费开源的视频稳定软件。它读取相机内置陀螺仪记录…

📰

gopsutil disk与load包详解:磁盘分区、IO计数器、系统负载一次看全

gopsutil disk与load包详解:磁盘分区、IO计数器、系统负载一次看全 【免费下载链接】gopsutil psutil for golang 项目地址: https://gitcode.com/gh_mirrors/go/gopsutil 想在 Go 程序里监控磁盘空间、磁盘IO和系统负载?gopsutil(Go …

📰

smolagents 构建高质量 Agent 实战指南:工作流简化、信息流优化与系统化调试方法论

smolagents 构建高质量 Agent 实战指南:工作流简化、信息流优化与系统化调试方法论 【免费下载链接】smolagents 🤗 smolagents: a barebones library for agents that think in code. 项目地址: https://gitcode.com/gh_mirrors/smo/smolagents 本…

📰

AI应用生产落地指南:从RAG到Agent,打通工程化全链路

从“能跑”到“能挣钱”:AI 应用开发生产落地实践指南先说说一个现象:这两年我见过太多团队,Demo 阶段风光无限,一到生产环境就抓瞎。RAG 问答在测试集上答得头头是道,上线后被业务部门拿真实数据一怼就翻车&#xff1…

📰

react-pdf实现原理揭秘:useResolver与可取消Promise如何消除竞态

react-pdf实现原理揭秘:useResolver与可取消Promise如何消除竞态 【免费下载链接】react-pdf Display PDFs in your React app as easily as if they were images. 项目地址: https://gitcode.com/gh_mirrors/rea/react-pdf react-pdf 让你像引用图片一样简单…

📰

提示词工程实战:从底层逻辑到模板库的完整指南

提示词工程这个词这两年已经被说烂了,但真正能把它的价值榨干的人其实不多。我见过太多人拿着大模型当搜索引擎用,问一句答一句,然后抱怨"这玩意儿也就那样"。也见过有人靠几行精心设计的提示词,把原本需要半小时的文案…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬