NPM 安装来自 package.json 的不同版本

NPM installs different version from package.json

对于我们的 Electron 应用程序,我们需要特定版本的 pixi.js (5.0.0-rc.3)。因此,在我们的 package.json 中,我们指定了 "pixi.js": "^5.0.0-rc.3",.

当我们 运行 npm install 现在打开我们的应用程序时,pixi 的欢迎消息和包-lock.json 状态版本 5.0.4。我们尝试删除 node_modules 文件夹并重新安装所有模块,但它仍然得到错误的版本。

我们在html文件中的import语句是const PIXI = require('pixi.js');,如果我没有记错的话,这应该得到本地安装的pixi版本。

这是一个错误吗?还是故意的(如果是,是什么目的)?

更新

由于现在有一些答案和评论,以下是我们目前进一步尝试的方法:

更新 2

现在有三个答案,none 可以解决目前的问题,我开始相信这不是我的错,但可能是 Pixi JS 的错误。我打开了一个问题 on their GitHub page,也许他们可以提供帮助。

如果要安装特定版本,请不要在 package.json 中使用 ~^,请使用完全相同的版本

The tilde ~ matches the most recent patch version (the third number) for the specified minor version (the second number).
~1.2.3 will match all 1.2.x versions but will hold off on 1.3.0.

The caret ^ is more relaxed. It matches the most recent minor version (the second number) for the specified major version (the first number).
^1.2.3 will match any 1.x.x release including 1.3.0, but will hold off on 2.0.0.

你的情况:"pixi.js": "5.0.0-rc.3"

发件人:What's the difference between tilde(~) and caret(^) in package.json?

原答案

如果您绝对需要该版本,您应该:

  • 将您的 package.json 文件更新为 "pixi.js": "5.0.0-rc.3"
  • 删除现有的 package-lock.jsonnpm-shrinkwrap.json 文件。
  • 重新运行npm i

通过这样做,您将依赖固定到该特定版本。

另请查看此 semver calculator。您可以加载 pixi.js 包。然后输入 5.0.0-rc.3^5.0.0-rc.3。它将向您展示 ^ 如何改变查找匹配项的行为。

我发现对于某些人来说,与阅读文档相比,计算器在视觉上通常有助于更好地理解 semver 数学。

希望对您有所帮助!

更新答案

如果您查看 package-lock.json 文件并查看 pixi.js 的依赖项,所有依赖项都使用 ^ 并且没有固定版本至 5.0.0-rc3。相反,他们被强制升级到最新的补丁版本,即 5.0.4 和 NPM/pixis 端的设置,而不是你的。

    "pixi.js": {
      "version": "5.0.0-rc.3",
      "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.0.0-rc.3.tgz",
      "integrity": "sha512-+B6ZMvJNEz/IoiC+BrwP9PsDonEAj4TOZw+yuZ/K8WQokcSm9uAp3PJ+6eFFWTjnkxsAcMP9tgldmDdTFoAF7w==",
      "requires": {
        "@pixi/accessibility": "^5.0.0-rc.3",
        "@pixi/app": "^5.0.0-rc.3",
        "@pixi/constants": "^5.0.0-rc.3",
        "@pixi/core": "^5.0.0-rc.3",
        "@pixi/display": "^5.0.0-rc.3",
        "@pixi/extract": "^5.0.0-rc.3",
        "@pixi/filter-alpha": "^5.0.0-rc.3",
        "@pixi/filter-blur": "^5.0.0-rc.3",
        "@pixi/filter-color-matrix": "^5.0.0-rc.3",
        "@pixi/filter-displacement": "^5.0.0-rc.3",
        "@pixi/filter-fxaa": "^5.0.0-rc.3",
        "@pixi/filter-noise": "^5.0.0-rc.3",
        "@pixi/graphics": "^5.0.0-rc.3",
        "@pixi/interaction": "^5.0.0-rc.3",
        "@pixi/loaders": "^5.0.0-rc.3",
        "@pixi/math": "^5.0.0-rc.3",
        "@pixi/mesh": "^5.0.0-rc.3",
        "@pixi/mesh-extras": "^5.0.0-rc.3",
        "@pixi/mixin-cache-as-bitmap": "^5.0.0-rc.3",
        "@pixi/mixin-get-child-by-name": "^5.0.0-rc.3",
        "@pixi/mixin-get-global-position": "^5.0.0-rc.3",
        "@pixi/particles": "^5.0.0-rc.3",
        "@pixi/polyfill": "^5.0.0-rc.3",
        "@pixi/prepare": "^5.0.0-rc.3",
        "@pixi/runner": "^5.0.0-rc.3",
        "@pixi/settings": "^5.0.0-rc.3",
        "@pixi/sprite": "^5.0.0-rc.3",
        "@pixi/sprite-animated": "^5.0.0-rc.3",
        "@pixi/sprite-tiling": "^5.0.0-rc.3",
        "@pixi/spritesheet": "^5.0.0-rc.3",
        "@pixi/text": "^5.0.0-rc.3",
        "@pixi/text-bitmap": "^5.0.0-rc.3",
        "@pixi/ticker": "^5.0.0-rc.3",
        "@pixi/utils": "^5.0.0-rc.3"
      }
    },

看起来如果你想让它工作,我真的只是建议你更新你的应用程序以使用更新的包而不是这样做,你需要

  • 5.0.0-rc3 标签上分叉 pixi.js,https://github.com/pixijs/pixi.js/tree/v5.0.0-rc.3
  • 更新 package.json 文件,使其所有依赖项 5.0.0-rc.3 而不是 ^5.0.0-rc.3
  • 创建对分叉存储库的依赖,而不是对已发布的 npm 模块的依赖。

TL;DR 解决方案是在您的 package.json 中明确指定 @pixi sub-modules 的确切版本,如下所示:

"dependencies": {
  "@pixi/core": "5.0.0-rc.3",
  ... (all other pixi submodules here) ...
  "pixi.js": "5.0.0-rc.3"
}

详细解释:

正在安装pixi.js模块版本5.0.0-rc.3,但这实际上只是一堆pixi的容器sub-modules有自己的版本。 sub-module 依赖项指定为 @pixi/core": "^5.0.0-rc.3"; ^ 导致 npm 获取更新的版本。

我能够通过将它们添加到 package.json 文件中来控制 sub-modules 的版本,在 pixi.js

的依赖项旁边

以下是我用来确认发生了什么并列出 pixi sub-modules:

的步骤
npm init -y                             ## Create empty npm module
npm install pixi.js@5.0.0-rc.3 --save --save-exact  ## Add pixi.js
cat package-lock.json                   ## See below
...
    "@pixi/core": {
      "version": "5.0.4",
      "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.0.4.tgz",
      "integrity": "sha512-P2K2JJC+BFZrRZT9P0+Ir8jd7VrH6w7/L1Njg2+iSetW9TdjkPahR+w93VGwpEzEkrYHoNs6FbSFCY38P/6g8A==",
      "requires": {
        "@pixi/constants": "^5.0.4",
        "@pixi/display": "^5.0.4",
        "@pixi/math": "^5.0.4",
        "@pixi/runner": "^5.0.4",
        "@pixi/settings": "^5.0.4",
        "@pixi/ticker": "^5.0.4",
        "@pixi/utils": "^5.0.4"
      }
    },
...
    "pixi.js": {
      "version": "5.0.0-rc.3",
      "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.0.0-rc.3.tgz",
      "integrity": "sha512-+B6ZMvJNEz/IoiC+BrwP9PsDonEAj4TOZw+yuZ/K8WQokcSm9uAp3PJ+6eFFWTjnkxsAcMP9tgldmDdTFoAF7w==",
      "requires": {
        "@pixi/accessibility": "^5.0.0-rc.3",
        "@pixi/app": "^5.0.0-rc.3",
        "@pixi/constants": "^5.0.0-rc.3",
        "@pixi/core": "^5.0.0-rc.3",
        "@pixi/display": "^5.0.0-rc.3",
        "@pixi/extract": "^5.0.0-rc.3",
        "@pixi/filter-alpha": "^5.0.0-rc.3",
        "@pixi/filter-blur": "^5.0.0-rc.3",
        "@pixi/filter-color-matrix": "^5.0.0-rc.3",
        "@pixi/filter-displacement": "^5.0.0-rc.3",
        "@pixi/filter-fxaa": "^5.0.0-rc.3",
        "@pixi/filter-noise": "^5.0.0-rc.3",
        "@pixi/graphics": "^5.0.0-rc.3",
        "@pixi/interaction": "^5.0.0-rc.3",
        "@pixi/loaders": "^5.0.0-rc.3",
        "@pixi/math": "^5.0.0-rc.3",
        "@pixi/mesh": "^5.0.0-rc.3",
        "@pixi/mesh-extras": "^5.0.0-rc.3",
        "@pixi/mixin-cache-as-bitmap": "^5.0.0-rc.3",
        "@pixi/mixin-get-child-by-name": "^5.0.0-rc.3",
        "@pixi/mixin-get-global-position": "^5.0.0-rc.3",
        "@pixi/particles": "^5.0.0-rc.3",
        "@pixi/polyfill": "^5.0.0-rc.3",
        "@pixi/prepare": "^5.0.0-rc.3",
        "@pixi/runner": "^5.0.0-rc.3",
        "@pixi/settings": "^5.0.0-rc.3",
        "@pixi/sprite": "^5.0.0-rc.3",
        "@pixi/sprite-animated": "^5.0.0-rc.3",
        "@pixi/sprite-tiling": "^5.0.0-rc.3",
        "@pixi/spritesheet": "^5.0.0-rc.3",
        "@pixi/text": "^5.0.0-rc.3",
        "@pixi/text-bitmap": "^5.0.0-rc.3",
        "@pixi/ticker": "^5.0.0-rc.3",
        "@pixi/utils": "^5.0.0-rc.3"
      }
    },
...

我 运行 遇到类似的问题,而不是需要 tildify 2.0.0,它总是安装 3.0.0 版本。
-
我一直在尝试手动更新 package.json 文件以更改版本,但这 没有 帮助。 这是我使用的命令,最终挽救了我的一天 -

第 1 步 - 手动删除 node_modules 文件夹

第 2 步 - 从您的 package.json 目录,运行 此命令卸载软件包

npm uninstall <package_name>

例子-

npm uninstall tildify

第 3 步 - 从您的 package.json 目录,运行 此命令安装具有确切版本的包

npm install <package_name>@<package_version> --save-dev --save-exact 

例子-

npm install tildify@2.0.0 --save-dev --save-exact