当前位置: 首页 > 知识库问答 >
问题:

pnpm会重复安装同一个版本的依赖?

卢毅
2023-11-22

比如

pnpm add electron@25.2.0
  • 我修改了先安装的E:\Electron模板\node_modules\electron\install.js
  • 然后在另一个项目安装electron@25.2.0

查看E:\Project\Electron\xxx\node_modules\electron\install.js
发现内容还是原始内容

修改的原因是网络环境问题

请问如何只保留一份呢?

我还安装了全局的electron@25.2.0,但报错说找不到electron,可控制台能找到,如果有全局包,pnpm还会安装局部包吗?

共有2个答案

蒋英博
2023-11-22
  1. pnpm 会把包缓存起来,然后通过硬连接放到项目本地,所以不同项目会共享一份文件。这样既可以节省存储空间,也可以节省下载的时间。
  2. 所以你在两个项目安装时,理论上是同一份文件。
  3. 至于修改后的内容丢失,我猜是你第二次安装的时候,pnpm 校验了文件内容,并且重新下载了一份。这是必须的,否则很可能会遭到供应链攻击。
  4. 全局包和本地包本就不是一回事,建议项目相关都用本地包。
  5. 不要改 node_modules 里的代码,除非是测试目的。找别的办法来处理。
请问如何只保留一份呢?

我不理解这个问题,你明明装了两次,一次修改一次不改,怎么会是一份?

全鸿晖
2023-11-22

这是一个很好的问题,关于pnpm是否会重复安装相同版本的依赖。首先,让我们解决第一个问题。

问题:pnpm会重复安装同一个版本的依赖吗?

答案:是的,pnpm会尝试安装指定版本的依赖,即使这个版本已经存在于你的node_modules中。这是因为pnpm的设计目标是提供一种高效的、可靠的依赖管理方式,并且它假设每个项目都有其自己的一份依赖。

然而,有一个解决方案可以避免这种重复安装。在安装依赖时,你可以使用--no-install选项,这样pnpm就不会尝试从包管理系统中下载和安装依赖。例如:

pnpm add electron@25.2.0 --no-install

这样,pnpm将创建一个指向全局安装的electron的链接,而不会复制整个node_modules目录。

然后,让我们解决第二个问题。

问题:我还安装了全局的electron@25.2.0,但报错说找不到electron,可控制台能找到,如果有全局包,pnpm还会安装局部包吗?

答案:是的,全局安装的包和项目内安装的包是不同的。全局安装的包可以在任何项目中直接使用,而项目内安装的包只能在当前项目中直接使用。因此,如果你在全局安装了electron,然后试图在另一个项目中安装一个局部的electron版本,这个局部版本会覆盖全局版本。这也解释了为什么你在控制台中可以找到全局的electron,但是在尝试安装局部版本时却找不到它。

为了避免这种情况,你可以在全局安装你需要的所有依赖,或者在每个项目中都使用相同的版本。如果你需要在多个项目中共享一些依赖,全局安装可能是更好的选择。但是要注意的是,全局安装的包可能会对全局环境产生影响,因此在选择是否全局安装包时需要谨慎考虑。

 类似资料:
  • Maven插件(maven-compiler-plugin: 3.8.1和maven-surefire-plugin: 3.0.0-M3)在运行mvn清洁包时似乎正在下载同一依赖项(plexus-utils)的多个版本,即使我在依赖项中指定了plexus-utils的最新版本。这不会导致任何错误,但3.0.16之前的任何版本的plexus-utils都容易受到命令注入的影响。有没有办法阻止这种情况

  • 我在文件夹只有这个json文件,我npm i的时候他是最新的axios,但是pnpm i的时候他就是1.1.3版本,这是为什么 这个json文件时通过npm和pnpm分别构建的,我试过清除pnpm的缓存但是没有用,lock文件和node_modules都删除了,但是Pnpm安装的不是最新的

  • 问题内容: 是否可以在同一台计算机上安装不同版本的NodeJS? 问题答案: 您可以使用几种节点管理器来实现此目的,但是最受欢迎的是: 虚拟机 ñ

  • 我正在使用maven 3.1.1,我有以下问题 我有一个主项目(pom.xml),它将被编译为WAR文件。它有两个模块。 模块1有以下内容(请注意工件的版本) 模块2有以下内容(请注意工件的版本) 因此,我的项目依赖于同一个库的两个版本。问题是库版本2与版本1不向后兼容。所以,我不能只包括版本2。 我正在考虑修改模块1以使用库版本2,但这需要大量时间。因此,我正在寻找一种方法来包含库的两个版本。

  • 问题内容: 我默认使用python2.6的ubuntu 10.04。我已经安装了python2.7。 当我想安装python软件包时 它被安装到python2.6。我如何才能将软件包安装到python2.7?有什么选择吗? 我已经看过这个,但我找不到我的OS这样的目录。我考虑过使用,但并非所有软件包都受支持。例如。 我对将python2.7与绑定更感兴趣。 问题答案: Python具有自己的软件包

  • 我有一个Maven项目,它包含两个依赖项,a和B,每个依赖项都传递依赖于C,但它们依赖于C的不同版本。假设a依赖于C版本1,而B依赖于C版本2。 不幸的是,A与版本2不兼容字节码,B与版本1也不兼容字节码。(碰巧,A与版本2是源代码兼容的,但我不认为这对我们在这里有帮助。) 这意味着我的项目中需要传递依赖项的两个版本,并且我需要A来使用版本1,需要B来使用版本2。 有办法做到这一点吗? 我假设我需