将 project_name/node_modules 作为符号链接?

pru*_*wan 2 symlink npm node-modules

相关:多个项目的单个 node_modules 文件夹

如果npm install -g不推荐所有内容,并且我不想链接单个模块,我是否可以符号链接<some project>/node_modules到由多个项目共享的公共目录?

use*_*629 9

在 npm >= 7.21.0 中你不能。当你这样做时,npm 将删除一个名为 node_modules 的符号链接npm install。我使用yarn作为解决方法,它可以很好地处理符号链接的node_modules文件夹。

  • 仍在研究中,但这似乎对我有用。尝试的步骤是1)删除`node_modules`和`package-lock.json`,2)创建`node_modules`作为符号链接:`ln -s /tmp/node_modules node_modules`,3)全局安装yarn:` npm install -g yarn`, 4) 使用yarn安装包:`yarn install`。到目前为止,据我所知,结果是您的“node_modules”文件夹仍然是符号链接,并且您的包安装在预期的目录中。现在要记住始终输入“yarn install”而不是“npm install”... (2认同)

Set*_*day 6

Node 可以完美地处理符号链接。如何实现这一点将取决于您的一些目标。最重要的是:对于从版本控制下载您的项目的其他开发人员,您希望有什么经验?

在设计此体验时,阅读有关 Node 模块加载算法的信息非常有帮助,可以深入了解可能的情况。

一般来说,我的建议是不要关心项目之间的重复依赖。“修复”这不值得维护成本,其中包括依赖关系僵局(子项目的需求冲突)以及在某些情况下需要自定义工具来解决您的自定义结构。

有了这个警告,我们该怎么做呢?最简单的方法是创建一个封装了各种子项目的超级项目。子项目将有效地继承超级项目的依赖项。

superproject/
|-- node_modules/
|   +-- socket.io/
|-- package.json
|-- subprojectA/
|   |-- node_modules/
|   |   +-- browserify/
|   |-- package.json
|   +-- app/
|       +-- client.js
+-- subprojectB/
    |-- node_modules/
    |   +-- express/
    |-- package.json
    +-- lib/
        +-- server.js
Run Code Online (Sandbox Code Playgroud)

这种结构的工作你怎么可能指望,子项目可以在文件require()自己的模块和任何那些的superproject/node_modules,但他们不会轻易require()他们的兄弟姐妹子项目中的模块(仍然可以通过显式路径这样做)。换句话说,client.js 可以在require()没有路径的情况下进行 browserify 和 socket.io,但是它需要使用路径来require()表达。

这样做的一个重要方面是npm“查找”搜索 package.json 并node_modules在安装时将目录中的模块作为该文件的同级处理等。这意味着您当前的工作目录需要是superproject为了在其中安装模块,除非您的子项目没有package.json文件。

  • “重复的依赖项”是一个巨大的问题,因为即使对于非常小的项目,这些文件也会占用相当多的空间,并且在设置使用(大部分)相同依赖项的新项目时还会导致间接浪费带宽。 (2认同)