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



我有一个项目,我用两台不同的笔记本电脑进行。有时我会在项目中添加额外的包,所以我必须使用npm install <package-name>(duh)。当我这样做时,我git push备份新的package.jsonpackage-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"
}
},

另一个设置包版本#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"
}
},

我知道插入符号(^)意味着版本不是100%精确的,但我正在努力弄清楚为什么我的不同笔记本电脑会为包版本创建不同的格式!我检查了这个SO问题,它对~^之间的差异有一些很好的解释,但我没有发现任何东西可以解释为什么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,但我仍然发现一台计算机总是删除^,另一台总是添加^

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

编辑:根据第20434期的讨论,这是使用npm>=6.0.0设计的。

为什么会发生这种情况 @rarkins在这条评论中详细解释了为什么会发生这种情况(以及它的优点)。为方便起见,他的评论如下(逐字逐句):

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

  • aaa取决于zzz@^1.0.0
  • bbb取决于zzz@^1.1.0
  • ccc取决于zzz@^1.0.1

,即它们都依赖于zzz的范围,而不是确切的版本

我们假设zzz的最新版本是1.5.0。

在这一更改之前和之后,很明显zzz的解析版本应该是1.5.0,所以唯一的区别是package-lock.json的结构和记录该子依赖关系的方式

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

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

然后考虑当zzz@1.5.1发布:

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

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

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

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

  2. 锁定文件中没有四行更改,而是只有一行。它减少了混乱,更清楚发生了什么

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

"@sindresorhus/is@0.10.0":
version "0.10.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.10.0.tgz#f42dd6a9d12cd79fa6f53b27cf5bea3a30d2cafa"
dependencies:
symbol-observable "^1.2.0"

原始答案:

在将修订后的package.jsonpackage-lock.jsongit pull安装到计算机上之后,请尝试删除node_modules目录,然后再安装这些包。

例如:

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

  2. 通过运行:rm -rf node_modules删除现有的node_modules目录。

  3. 然后运行:npm install

或者您可以使用&&操作符将上述两个命令链接起来:

rm -rf node_modules && npm install

最新更新