0

假设 package.json 中的所有引用都是 ^1.0.0 并且我只修改补丁版本。

我有 A 依赖于 B 依赖于 C:A > B > C。我恢复 A 并注意到 CI get 的版本是在 B 之后发布的。我预计在 B 之前发布的 C 的最新版本会被恢复,但我实际上在 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 中列出。

4

1 回答 1

0

如果我假设它的设计者试图减少到 npm.org 的网络流量,那么它的行为npm就更有意义了。

npm install>v2.6.1如果可能,将使用缓存来满足间接依赖关系,即使最近的令人满意的版本已发布到 npm.org;npm install不会检查是否有最近发布的缓存包版本。

有两种方法可以强制 npm 检查服务器的最新包版本:(1) 使用--depth 9999或 (2) 使用npm cache clear --froce.

我认为npm publish应该在本地缓存新包...

于 2019-01-04T22:39:28.590 回答