NPM 总是安装最新的预发布版本

3

我目前正在设置一个新的npm包的预发布版本(在dev标签下)。

enter image description here

在我的暂存环境中,我希望npm始终安装2.0.0版本的最新预发布版。因此,在package.json中我指定了"<packagename>": ">=2.0.0-dev.0",但是npm总是安装2.0.0-dev.20180806T153307Z.3eaa718.HEAD,即使我使用删除了package-lock.json的干净安装。 根据semver-checker,我的限制条件与已发布到npm的预发布版匹配。


请勿发布包含文本的图像。请复制并粘贴文本,而非图像。这样可以确保没有人会为了测试而获取您的数据副本。 - jwdonahue
由于您的日期/时间戳是字母数字混合的,因此Semver要求使用词法排序而不是数值排序。您选择的预发布标签不太合适。我建议切换到YYYYMMDD.HHMMSS.Z格式。 - jwdonahue
@jwdonahue 对不起,我发错了图片。你是对的,我不明白我的格式和你的建议有什么区别。 - Vetterjack
数字字段按数字排序,字母数字混合字段按字典序排序。数字上11 > 0,字典序上0 > 11。字典序排序基于字符的代码点,而数字排序需要将字符串转换为数字。任何包含非数字内容的带点字段都是字母数字混合字段。对于任何以零开头的带点字段也是如此,因此我的建议也是错误的。它应该更像Y.M.D.H.M.S.Z。请阅读semver规范 - jwdonahue
@jwdonahue 好的,现在我明白了这个词法排序。但是为什么语义化版本检查器、语义化版本npm包和语义化版本实现告诉我,更新的预发布版本(例如 1.0.0-dev.20180809T143945Z.c0a13a1.HEAD)符合我的约束条件? - Vetterjack
NPM使用的范围规范格式是他们自己发明的。Semver并没有指定任何种类的范围规范/匹配,除了如何对Semver字符串进行排序。他们提供了Semver未指定的行为,因此您真的应该向他们提出此问题。您是否在NPM问题跟踪系统中寻找相关的错误? - jwdonahue
1个回答

2

我终于找到了问题所在。因为此软件包之前没有发布过非开发版本到npm,所以npm总是安装与latest标签相连的预发布版本(请参见上面问题中的图片)。解决方法就是简单地发布一个假的版本,比如1.9.9。现在,干净的npm install可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接