如何使多个项目共享node_modules目录?


95

每当我创建项目时,都必须下载节点模块的所有依赖项。无需复制node_modules,是否仍然可以在多个项目中共享中央node_modules?

像以下内容一样,我每次都必须运行许多命令。

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
您可以将它们安装在公共的父目录(如果有)中。节点将在目录中查找required模块。否则,不会,没有node_modules与一起使用的官方“中央”文件夹require()
Jonathan Lonowski

您可以使用global标志全局安装这些软件包。因此,您不必每次都运行安装命令。npm install <npm_package_name> -g
Saba Hassan

Answers:


90

您绝对可以在项目之间共享一个node_modules目录。

节点的文档

如果传递给require()的模块标识符不是本机模块,并且不是以'/'、'../'或'./'开头,则节点从当前模块的父目录开始,并添加/ node_modules,并尝试从该位置加载模块。

如果在该目录中找不到该目录,则它将移动到父目录,依此类推,直到到达文件系统的根目录为止。

例如,如果位于'/home/ry/projects/foo.js'的文件名为require('bar.js'),则node将按以下顺序查找以下位置:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

因此,只需将一个node_modules文件夹放入您的项目目录中,然后放入所需的任何模块即可。像平常一样要求他们。当节点在您的项目文件夹中找不到node_modules目录时,它将自动检查父文件夹。因此,使目录结构像这样:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

因此,即使您子项目的依存关系也可以利用您的主要node_modules存储库。

这样做的一个缺点是,您将必须手动构建package.json文件(除非有人知道用grunt或其他方法自动执行此操作的方法)。当您安装软件包并将--save arg添加到npm install命令时,它将自动将其追加到dependencies部分或package.json中,这很方便。


3
为什么不接受此作为答案操作?@tpie的另一个问题是,是否应该像您建议的那样构建一个项目,如何构建package.json以从父模块存储库安装。
diehell

@diehell看来这是“全有还是全无”。如果所有或依赖项都位于父目录中,并且CWD中没有node_modules目录,则npm将检查父目录并在找到父目录时进行安装。如果将node_modules文件夹放在目录中,它将安装在该目录中。
tpie '16

4
我看不到共享node_modules如何处理不同的软件包版本,node_modules中的软件包未版本化,不像c:\ users(Windows)中的npm-cache,有人遇到了吗?
游客

编写npm脚本和package.json文件时,如何修改范例?
Maddocks

18

我发现了一个窍门,只是看看Windows或Linux上符号链接(符号链接),它就像快捷方式一样工作,但功能更强大。

只需在所需的任何位置Junctionnode_modules文件夹创建一个。结点不过是您原始的node_modules文件夹的捷径。在您的项目文件夹中创建它,如果使用该文件夹,则将在其中创建实际的node_modules npm install

为此,您至少需要一个node_modules真实的文件夹,然后在其他项目中为其创建一个Junction。

在Windows上,您既可以使用命令提示符,也可以使用应用程序。建议您使用命令提示符给您更多控制,使用应用程序更容易,我建议使用Link Shell Extension


1
我cd到目标目录,运行此命令:mklink /d node_modules (source dir)\node_modules
ChrisTorng

1
我的团队已经使用这种方法已有一段时间了。虽然我真的很鄙视node_modules项目文件夹本身,但是这样做确实可行。只是要记住node_modules在安装任何新内容之前浏览到实际的文件夹:P
Andrew Craswell,

这种方法似乎对我不起作用。当我使用符号或结点时,node-sass出现以下错误:模块构建失败:“错误:模块未自注册”,并且该错误具有更多详细信息,指定了“共享” node_modules目录所在的目录。有任何想法吗?
flipcode

1
npm install在任何“已连接”应用程序中运行时,如何避免依赖项删除?
Qwerty

1
但是当我运行npm install <new-package>所有不在当前项目的package.json中的软件包时,它们将被删除。
Rohit Kaushal

17

尝试使用pnpm而不是npm。

pnpm使用硬链接和符号链接仅一次将一个版本的模块保存在磁盘上。

安装方式:

npm install -g pnpm

要更新现有的安装(和子目录),请使用:

pnpm recursive install

8

主目录应如下所示

node_modules
Project 1
Project 2
Project 3
Project 4

只需打开文件 Project 1/.angular-cli.json

更改架构

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

并且不要忘记node_modules在项目目录中创建空文件夹


你是我的英雄。我花了一个星期。非常感谢!!
Eliezer Berlin


0

假设只有一个node_modules,它应该包含所有应用程序的所有软件包。因此,您的应用程序还将共享大多数唯一的package.json条目(只是名称应更改)

我的想法是有一个单一的根和多个src级别,如下所示

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

您可能面临的唯一问题是为任何应用程序备份json(或tsconfig)并在您使用它或设置启动脚本以服务任何应用程序时将其还原


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.