npm版本发布上的一个坑

Author Avatar calidion 发表于 • 2016年06月20日 22:00 • 共 • 886 • 次浏览

npm的最后发布是一个可能会被坑的地方。

坑的发现

由于最近项目功能基本完成,开始对代码做一些精简,并准备将原来的waterline的分页部分提取出来成为一个独立的package:waterline-paginator 但是我的waterline安装发现出错了。 原因是有一个microtime的包编译通不过。 但是通过对比之前的waterline版本,发现waterline@latest的版本竟然是0.1.4,而waterline最高的版本实际上是0.12.2。 所以0.1.4根本是一个错误的版本。并且也是没有能通过node新版本测试的版本。

坑的报告

所以我在waterline与npm两个地方都发了issue. waterline还没有回复,npm回复了,并且认为不是npm的问题。 我感觉这种说法还是有点反常识吧? 因为我们使用npm install xxx时实际上是默认会安装最高版本的新近更新的。 而实际上呢? 并不是这样的。

坑的详情

下面我们来做下几个实验: 我随意创建了一个叫bad-version的包,然后按顺序做如下的发布。

npm publish
+ bad-version@0.0.1
npm publish
+ bad-version@0.2.1
npm publish
+ bad-version@0.0.2
npm show bad-version@latest version
0.0.2
npm install -g bad-version
/home/eric/.nvm/versions/node/v4.2.3/lib
└── bad-version@0.0.2 

我们发现,bad-version一个有[0.0.1, 0.2.1, 0.0.2]三个版本。 在我们发布完成后,我们通过

npm i bad-version

得到的是[0.0.2],而不是[0.2.1]。 想想都有点可怕,npm竟然可以这样的违反常识。

解决办法

发布是加上一个tag npm publish --tag=0.0.1 默认tag是latest

总结

对于包的维护者来说这个问题确实挺坑的,好在已经有解决方法。虽然不直观,但是也是很实用的。 所以当有多个版本在维护时,一定要使用tag,防止你的latest版本被覆盖。

最后编辑于 • 2016年06月20日 22:00 •  

你尚未登录,无法进行回复。