NPM 何时会恢复依赖包之后发布的依赖项?
Posted
技术标签:
【中文标题】NPM 何时会恢复依赖包之后发布的依赖项?【英文标题】:When, if ever, will NPM restore dependencies published after the dependent package? 【发布时间】:2019-05-31 11:18:22 【问题描述】:假设 package.json 中的所有引用都是 ^1.0.0,我只修改补丁版本。
我有 A 依赖于 B 依赖于 C:A > B > C。我恢复 A 并注意到 CI get 的版本是在 B 之后发布的。我期望 C 的最新版本 在 B 之前发布 会恢复,但实际上我得到了一个在 B 之后发布的 C 版本。
然后我发布了一个 C 的空补丁并尝试升级 A 并期望看到新版本的 C。但是没有任何改变;用 A 恢复的 C 版本与我发布新版本 C 之前得到的版本相同。
那么,在恢复 ^1.0.0 形式的依赖项时,NPM 是否会考虑何时发布包?
从 npm@2.6.1 开始,npm 更新将只检查***包。以前版本的 npm 也会递归地检查所有依赖项。要获得旧行为,请使用 npm --depth 9999 update。
我运行的是 6.4.1,所以默认情况下我没有得到递归行为。使用深度标志,我看到 C 已更新到新版本。
但是,这仍然不能解释为什么首先同步 B 之后发布的 C 版本;当我第一次同步时,即使我没有传递深度标志,NPM 也必须递归所有依赖项。在初始同步期间,它应用了什么策略?
现在,如果我删除 node_modules
文件夹并运行 npm install
,我始终会获得新版本的 C。就好像 npm 记得我以前使用深度标志运行 npm update 但是我没有发现我的记录在packages.json 中这样做是因为C 没有在A 的packages.json 中列出。
【问题讨论】:
【参考方案1】:如果我假设npm
的设计者试图减少到 npm.org 的网络流量,那么 npm
的行为就更有意义了。
npm install
> v2.6.1
将尽可能使用缓存满足间接依赖关系,即使最近的令人满意的版本已发布到 npm.org; npm install
将不检查是否有最近发布的缓存包版本。
有两种方法可以强制 npm 检查服务器的最新包版本:(1) 使用 --depth 9999
或 (2) 使用 npm cache clear --froce
删除缓存。
我认为npm publish
应该在本地缓存新包...
【讨论】:
以上是关于NPM 何时会恢复依赖包之后发布的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章