案例库 · 工程与运营 · 技术决策 · 2011-2013
语义化版本:将兼容性编码进主版本号.次版本号.修订号
SemVer让版本号说明更改是否破坏兼容性,使依赖管理器能自动解析。
GitHub
那一手
软件依赖其他软件,当库发布新版本时,第三方不知道更改是否破坏了任何东西。天真的契约是总是取最新版本,这导致了依赖地狱:新版本能编译,然后应用崩溃,原因不明。
语义化版本通过让版本号本身成为契约来修复此问题。三个位置主版本号.次版本号.修订号各有含义:主版本号增加表示不兼容更改,次版本号增加表示向后兼容的新功能,修订号增加表示修复。
一旦数字编码了兼容性,解析器就能自动决定。原本分散在每次集成中的人为判断现在被捆绑到一个工具可读的三部分数字中。
为什么管用
- 主版本号的升级作为强破坏性变更信号,让解析器无需人类参与即可拒绝不兼容的更新。
- 因为次版本号和修订号的保证是向后兼容的,它们给了依赖一个安全范围。
- 限制三个位置消除了曾经使“最新”无意义的任意版本膨胀。
- 像npm、Cargo和Composer这样的工具完全基于这个约定构建了它们的解析规则。
值了多少利用版本号传达兼容性含义。聪明
可以搬走什么
一个小的可执行约定,如果它能编码人们曾经猜测的东西,就能消除整个类别的手动判断。
后来呢
Tom Preston-Werner于2011年发布规范,并于2013年正式化为2.0.0版本。它成为开源包生态系统的事实版本标准。它不会捕捉到版本升级中的语义错误,并且预发布和构建元数据规则增加了复杂性,但核心契约使自动化依赖解析成为可能。
资料来源
发现哪里写错了?告诉我们。