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 何时会恢复依赖包之后发布的依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 npm 包依赖

npm 依赖项是不是需要其父包中的模块

npm - 将安装的包保存为依赖项

NPM 仅安装后依赖项

npm WARN 该包同时包含在开发和生产依赖项中

yarn的使用及工作流程