假设package.json中的所有引用均为^ 1.0.0,而我仅修改了补丁版本。
我有一个依赖于B的C,它依赖于C:A> B>C。我还原A并注意到CI get的版本在B之后发布。我期望在B之前发布的最新版本C 。 将被恢复,但实际上我在B之后发布了C版本。
然后,我发布了C的虚空补丁,并尝试升级A以期希望看到C的新版本。用A还原的C版本与发布新版本的C之前的版本相同。
那么,NPM在恢复格式为^ 1.0.0的依赖项时是否考虑发布软件包的时间?
从npm@2.6.1开始,npm更新将仅检查顶级软件包。以前版本的npm也将递归检查所有依赖项。要获得旧的行为,请使用npm --depth 9999更新。
我正在运行6.4.1,因此默认情况下我没有得到递归行为。使用depth标志,我看到C已更新为新版本。
但是,这仍然不能解释为什么B以后首先同步发布的C版本?首次同步时,即使不传递深度标记,NPM也必须递归所有依赖项。在初始同步过程中,它将应用什么政策?
现在,如果我删除node_modules
文件夹并运行npm install
,我将始终获得新版本的C。这似乎是npm记得我以前用depth标志运行过npm update,但是我发现没有在A的packages.json中列出我在packages.json中作为C所做的记录。
答案 0 :(得分:0)
如果我假设npm
的设计者试图减少npm.org的网络流量,那么它的行为就更有意义了。
npm install
> v2.6.1
将尽可能使用缓存来满足间接依赖关系,即使已将更新的令人满意的版本发布到npm.org上也是如此; npm install
将不检查是否有更高版本的缓存软件包。
有两种方法可以强制npm检查服务器的最新软件包版本:(1)使用--depth 9999
或(2)使用npm cache clear --froce
删除缓存。
我认为npm publish
应该在本地缓存新软件包...