2015-04-22 128 views
36

每当我做项目时,我都必须下载节点模块的所有依赖关系。在不复制node_modules的情况下,是否有共享多个项目中的中央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 
+1

你可以安装它们在一个共同的父目录中,如果有的话。 Node会[遍历目录](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)搜索'require'd模块。否则,不,没有官方的“central”node_modules文件夹用于require()。 –

+0

您可以使用全局标志全局安装这些软件包。所以你不需要每次都运行安装命令。 'npm install -g' –

回答

40

你绝对可以共享node_modules目录之中的项目。

node's documentation

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

如果在那里没有找到它,那么它将转到父目录,并且如此类推,直到达到文件系统的根目录为止。

例如,如果在“/home/ry/projects/foo.js”的文件名为 要求(“bar.js”),则节点会看在以下位置,在 顺序如下:

/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命令中时,它会自动将其附加到依赖项部分或package.json中,这很方便。

+1

为什么这不被接受为答案op?对@tpie的进一步问题,应该像你所建议的那样构建一个项目,如何构建package.json以便从父模块存储库进行安装。 – diehell

+0

@diehell因此,它似乎是“全部或全部”。如果所有或依赖关系都存在于父目录中,并且CWD中没有node_modules目录,则npm将检查父目录并在其中找到它。如果你将一个node_modules文件夹放在它将要安装的目录中。 – tpie

4

我找到了一招,只要看看Symbolic Links (symlinks) on Windows or Linux,它就像快捷键一样工作,但功能更强大。

只需在需要的任何地方为您的node_modules文件夹制作一个Junction即可。

要实现这一目标,至少需要一个node_modules真实文件夹,然后在其他项目中为其建立连接。

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

+1

我cd到目标目录,运行这个命令:'mklink/d node_modules(源目录)\ node_modules'。 – ChrisTorng

+1

我的团队现在一直在使用这种方法。虽然我真的很鄙视在项目文件夹本身没有'node_modules',这是有效的。在安装新的东西之前,请记得浏览到实际的'node_modules'文件夹:P –

0

我们假设有一个node_modules它应该包含所有应用程序的所有包。因此,您的应用程序也将分享最独特的package.json项(只是名称应该改变)

我的想法是有一个根和多个SRC级别,如下

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

唯一的问题你可能会面临将有JSON(或tsconfig)的任何应用程序备份,当你在上面或设置工作启动脚本,以服务于任何应用

1

主目录应该是这样的

node_modules 
Project 1 
Project 2 
Project 3 
Project 4 
0123恢复它们

只需打开该文件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空文件夹