开发与运维

版本号与依赖包工具

版本和依赖问题总是跨生态出现:一个 npm 范围到底匹不匹配你要发布的版本,一个 package.json 的 exports 字段解析结果和打包工具预期是否一致,或者一条 Maven 依赖翻译成 Gradle DSL 该怎么写。这里有 SemVer、PEP 440 等包管理器的版本工具,以及 package.json 及 exports 映射编辑器。

SemVer 计算器比较版本大小并测试 npm 范围,PEP 440 版本测试按 Python 更严格的版本规则来,两者并不完全一样。package.json exports 可视化按 import 和 require 两种条件测试子路径解析,能发现普通 JSON 查看器看不出的不匹配。Maven 转 Gradle 覆盖跨生态依赖转换。

8 个工具

版本号 / 包与依赖工具常见问题

npm 版本范围为什么匹配到了一个没预期到的版本?

^1.2.3 或 ~1.2.3 这类范围各自遵循不同的 semver 规则来决定哪部分数字可以变化,caret 范围对 0.x 版本和 1.x 版本的处理方式也不一样,容易看错。SemVer 计算器可以直接测试一个版本是否匹配某个范围,不用自己在脑子里推。

1.0.0rc1 这样的 Python 版本号合法吗,排序在哪?

在 PEP 440 里这是合法的预发布版本,排序在正式发布的 1.0.0 之前。PEP 440 版本测试会规范化并排序一批 Python 版本号,还能核对约束字符串,比按普通字符串比较可靠得多。

package.json 的 exports 为什么 import 能用 require 却不行,或者反过来?

exports 字段可以把不同文件分别映射给 import 和 require 两种条件,把一个只支持 CommonJS 的文件映射到 import 条件之类的不匹配会导致一边能解析另一边不能。package.json exports 可视化会按两种条件分别测试子路径解析,发布前就能发现问题。