Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.4k views
in Technique[技术] by (71.8m points)

npm 版本管理的坑

项目中package.json里面一个包依赖是这样

"react-scroll-bar": "^0.0.3-drink.2"

但是每次yarn安装的时候实际安装的是0.0.3-polor.6这个版本,我理解^是安装大范围最新的包,但是按理说我指定了具体tag名(drink),为什么这里会安装到polor这个tag去(难道^的检查跟tag无关???),此外,我检查了lock文件没有问题,把lock全部删除了重新装也没用,所以应该跟yarn.lock无关,求大神解答下??


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

^ 匹配同主版本的最新。

你这里表示只匹配最新一个 0.x.x-x 的版本,跟 x.x-x 没有关系。

这是因为设计 npm 的那帮人最开始假设只有大版本才有 Breaking Changes,新增点儿 Feature 或是 BugFix 不影响同一个主版本的低版本。

但事实证明他们错了,并不是所有开发者都遵守了这个规矩,导致“坑深蒂固”。

package-lock.json 就是负责填这个坑的。

tag 其实就是版本的别名,常见于同时存在多个版本分支的包中。你这里的并不是 tag。vue@latestvue@nextvue@alpha 里的 latestnextalpha 这些才是 tag。一个包发布时,不指定 tag 的话默认就是 latest


你要想强制指定特定版本,那就把 ^ 去掉。

另,~ 匹配同次版本的最新一个;* 匹配所有版本最新一个。

P.S. yarn.lock 理论上应该会记录下你这个项目初始化时装的那个版本啊,其他人克隆你项目后只要不删它,应该没事儿才对。反正我没复现出来你说的这个问题。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...