为什么 `npm install` 在版本号中添加/删除插入符 (^)?

Blu*_*her 7 npm npm-install

我有一个使用两台不同笔记本电脑进行的项目。有时我会向我的项目添加额外的包,所以我必须使用npm install <package-name>(废话)。当我这样做时,我git push会更新新的package.json文件package-lock.json,当我切换计算机时,我必须进行git pull这些更改,然后npm install再次运行以将该包传输到另一台计算机上。

^我最近注意到并开始关心一台笔记本电脑不断在每个软件包版本号的开头添加插入符 ( )。例如:

一台计算机将软件包版本号设置为如下所示:

"regexpu-core": {
  "version": "1.0.0",
  "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
  "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
  "requires": {
    "regenerate": "1.4.0",
    "regjsgen": "0.2.0",
    "regjsparser": "0.1.5"
  }
},
Run Code Online (Sandbox Code Playgroud)

其他设置包版本#s如下所示:

"regexpu-core": {
  "version": "1.0.0",
  "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
  "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
  "requires": {
    "regenerate": "^1.2.1",
    "regjsgen": "^0.2.0",
    "regjsparser": "^0.1.4"
  }
},
Run Code Online (Sandbox Code Playgroud)

我知道插入符 ( ^) 意味着版本不是 100% 精确,但我试图找出为什么我的不同笔记本电脑为软件包版本创建不同的格式!我检查了这个问题~,其中对和之间的差异有一些很好的解释^,但我没有找到任何解释为什么npm有时会添加有时会^完全删除插入符 ( ) 的内容。我还在 Github 上查看了这个 npm 问题,建议查看npm配置设置,但我的两台笔记本电脑都有相同的设置:

  • npm config get save= true(两台计算机)
  • npm config get save-prefix= ^(两台计算机)
  • npm config get save-exact= false(两台计算机)

一台笔记本电脑正在运行npm版本5.6.0,但我刚刚将其更新为6.5.0. 另一台电脑正在运行版本6.4.1,但我也将其更新为6.5.0. 我尝试npm install在两台计算机上运行我的项目,但我仍然发现一台计算机总是删除^而另一台计算机总是添加^.

如果我缺少什么,请告诉我。谢谢你的帮助!

Rob*_*obC 3

编辑:根据问题#20434中的讨论,这是使用 npm 设计的>=6.0.0

\n

为什么会出现这种情况?\n @rakins在此评论中详细解释了发生这种情况的原因(以及它\xe2\x80\x99 的优点)。为了方便起见,他的评论引用如下(逐字):

\n
\n

假设您使用依赖项“aaa”、“bbb”和“ccc”的固定版本。假设它们都依赖于“zzz”,如下所示:

\n
    \n
  • aaa 取决于 zzz@^1.0.0
  • \n
  • bbb 取决于 zzz@^1.1.0
  • \n
  • ccc 依赖于 zzz@^1.0.1
  • \n
\n

即它们三个都依赖于 zzz 的范围,而不是精确的版本。

\n

假设 zzz 的最新版本是 1.5.0。

\n

在此更改之前和之后,很明显 zzz 的解析版本应该是 1.5.0,因此唯一的区别在于package-lock.json结构和记录此子依赖项的方式。

\n

之前,锁定文件会显示它们三个都依赖于 zzz@1.5.0,并且 z 的解析版本是 1.5.0。

\n

现在,它记录了每个依赖项的实际“原始”依赖项版本(例如 ^1.0.0、^1.1.0 等),但仍将 z 的解析版本显示为 1.5.0。

\n

然后考虑 zzz@1.5.1 发布后会发生什么:

\n

之前,锁定文件需要在所有四个位置从 z@1.5.0 更新到 z@1.5.1。

\n

现在,锁定文件只需将 z 的解析版本更新为 1.5.1,而依赖项可以保留 ^1.0.0、^1.1.0 和 ^1.0.1,因为它们没有更改。

\n

正如我之前在线程中提到的,在这两种情况下您仍然会得到完全相同的 node_modules。新方法的优点是:

\n
    \n
  1. 您可以看到依赖项实际需要什么(例如范围,而不是确切的版本)。以前,您无法判断 aaa 是否确实需要 zzz@1.5.0,或者它是 zzz@^1.0.0。

    \n
  2. \n
  3. 您只得到一行,而不是锁定文件中的四行更改。流失更少,发生的事情也更清楚。

    \n
  4. \n
\n

顺便说一句,yarn使用与 类似的概念yarn.lock。例如,这是一个@sindresorhus/is固定的示例,但它的子依赖符号可观察不是:

\n
"@sindresorhus/is@0.10.0":\n version "0.10.0"\n resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.10.0.tgz#f42dd6a9d12cd79fa6f53b27cf5bea3a30d2cafa"\n dependencies:\n   symbol-observable "^1.2.0"\n
Run Code Online (Sandbox Code Playgroud)\n
\n
\n

原答案:

\n

git pull修改后的package.jsonpackage-lock.json复制到计算机上后,请尝试删除node_modules目录,然后再次安装软件包。

\n

例如:

\n
    \n
  1. 首先cd到计算机 2 上的项目目录。

    \n
  2. \n
  3. 通过运行以下命令删除现有的node_modulesrm -rf node_modules目录:

    \n
  4. \n
  5. 然后运行:npm install

    \n
  6. \n
\n

或者您可以使用运算符链接上述两个命令&&

\n
rm -rf node_modules && npm install\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这并没有回答问题_为什么_ npm 在 `npm i` 上的锁定文件中添加/删除插入符号 (^) .. 太糟糕了,因为我遇到了同样的问题并且不需要解决方法,但我想知道为什么会发生这种情况(以及如何使其与/不与node_modules目录保持一致) (3认同)