Dart SDK版本发布机制揭秘:实验特性从Flag引入到退役的完整生命周期
Dart SDK版本发布机制揭秘实验特性从Flag引入到退役的完整生命周期【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址: https://gitcode.com/gh_mirrors/sdk1/sdkDart SDK 是 Dart 语言的官方开发工具包包含虚拟机VM、JS 与 Wasm 编译器、静态分析器和核心库。它通过 main、dev、beta、stable 四个分支管理版本发布所有新语言特性都会经历实验特性 Flag 引入 → 默认启用 → 退役的完整生命周期。本文将带你快速看懂这套机制的运作细节。四大分支与三条发布通道Dart SDK 的分支结构非常简洁日常开发全部发生在main分支未就绪的特性一律藏在实验 Flag 后面等稳定后再默认开启。分支作用更新频率main日常开发所有改动首先落到这里持续dev从 main 全量推送面向尝鲜用户约每周 2 次beta从 dev 全量推送发布前最后打磨约每月 1 次stable正式发布分支只接受关键修复按需 记住一个原则不要在 dev / beta / stable 分支上直接提交代码这些分支只通过全量推送或 cherry-pick 接收内容。详见 docs/Branches-and-releases.md。约 2 个月的发布节奏cherry-pick 赛季一个完整的 Dart SDK 发布周期大约2 个月滚动开发期main 的代码每约两周全量推送到 dev形成绿色构建⏳最后 2 周进入cherry-pick 赛季dev 的最新版本全量推送到 beta此后只允许把关键修复 cherry-pick 进 beta每周多批✅稳定后推 stablebeta 看起来可靠后合入 stable 正式发布之后 stable 通道只发布安全、崩溃和严重 bug 的补丁版本。版本号的源头是 tools/VERSION 文件当前记录的正是3.14.0这一版本每次切分支、发版、cherry-pick 都会按规则递增其中的字段。cherry-pick 的完整流程如何发起、提交信息怎么写见 docs/Cherry-picks-to-a-release-channel.md。下图展示了 Dart 生态中时间线timeline这一概念的可视化形式发布周期的推进逻辑与其类似不同阶段的事件按时间顺序依次发生、互相衔接。实验特性的四个状态从引入到退役所有实验特性统一登记在 tools/experimental_features.yaml 中每个条目通过enabledIn、experimentalReleaseVersion、expired等字段流转于四个状态状态含义关键动作Disabled默认关闭特性刚提出默认不可用团队在 Flag 保护下开发用户可手动开启尝鲜Experimental release实验发布特定库/包可默认启用写入 sdk/lib/_internal/allowed_experiments.json 白名单并提升experimentalReleaseVersionShipped正式发布特性默认开启不可关闭添加enabledIn字段指明随哪个版本发布Retired退役/ Rejected否决Flag 不再接受标记expired: true条目计划最终移除这份文件的头部注释就是官方状态机说明书配合 docs/process/experimental-flags.md 可以完整理解规范所有破坏性变更和语言变更都必须在可能时置于 Flag 之后开发且 Flag 后的内容随时可能变化甚至取消。开发者如何开启实验特性对于想在发布前试用新特性的开发者主要有两种方式说明见 docs/Experimental-Flags.md命令行给工具传--enable-experimentflag-name参数支持逗号分隔多个 Flag例如dart --enable-experimentmacrosIDE / 分析器在项目的analysis_options.yaml中通过enable-experiment:键声明让代码补全和静态分析同步生效。如果传入了已退役的 Flag工具只会在 stderr 提示未知实验不会报错中断——这是规范明确要求的容错行为。语言版本与实验特性的联动理解 Flag 生命周期还需理解语言版本模型详见 docs/process/language-versions-and-experiments.md每个主/次版本.0发布都会刻入石头形成一个永不再变的语言版本在开发的版本旁悬挂着它的一族实验性兄弟语言每种 Flag 组合对应一种语言如2.8non-nullable、2.8variance⚠️ 实验 Flag 只作用于进行中的语言版本——不存在2.7non-nullable这种组合已发布版本永远锁定。这意味着一个新版本发布后未发布的 Flag 不会自动消失而是顺延到下一个进行中的版本继续实验直到团队认定它足够稳定。Flag 退役的三步时间表与七步清单按照官方流程一个实验特性通常跨越3 个版本走完生命周期阶段版本节点发生什么1️⃣ 引入第 n-1 版 beta 1特性以 Flag 形式公开用户可开启试用2️⃣ 转正第 n 版 beta 1Flag 默认开启进入稳定通道观察3️⃣ 退役第 n1 版 beta 1Flag 正式退役并清理退役的标准是在 stable 通道完整经历一个发布周期约 3 个月且没有引发重大问题。具体退役工作包含七步清理使用实验 Flag 的测试确认非测试代码不依赖该 Flag检查/pkg/*目录下的测试同样无依赖在 tools/experimental_features.yaml 中设置expired: true运行各组件的代码生成脚本如 pkg/analyzer/tool/experiments/generate.dart 和 tools/generate_experimental_flags.dart更新 Flag 处理代码通知 EngProd 团队收尾EngProd 团队递增 SDK 版本号。 官方文档还举过一个生动的例子以假想的 telepathy 特性为例在 Dart 6.1 beta 中通过 Flag 试用6.2 默认开启团队在 6.3 发布前完成测试清理并移除 Flag——这正是上述三步时间表的真实写照。延伸阅读仓库内的相关文档想深入细节以下资料值得收藏分支与发布流程docs/Branches-and-releases.md实验 Flag 使用规范docs/Experimental-Flags.mdFlag 开发流程docs/process/experimental-flags.md语言版本与实验特性模型docs/process/language-versions-and-experiments.md破坏性变更流程docs/process/breaking-changes.md实验特性登记表tools/experimental_features.yaml小结Dart SDK 的版本发布机制可以概括为一句话新特性永远先在 Flag 后面出生经历实验 → 默认开启 → 稳定观察 → 退役的完整生命周期配合约 2 个月的发布节奏和严格的 cherry-pick 纪律保证 stable 通道的可靠。下次你看到--enable-experiment参数时就已经站在了这套机制的正中央。【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址: https://gitcode.com/gh_mirrors/sdk1/sdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考