在 package.json 中指定 node_module 的路径

有没有一种方法可以像 bower 处理 bowerrc 文件那样移动应用程序中的 node _ module 目录?我认为它可以在 package.json 中指定,但似乎找不到解决方案。非常感谢你的帮助。

165233 次浏览

可以,只需设置 NODE _ PATH env 变量:

export NODE_PATH='yourdir'/node_modules

医生说:

如果 NODE _ PATH 环境变量设置为冒号分隔的列表 的绝对路径,然后节点将搜索这些路径的模块,如果 (注意: 在 Windows 上,NODE _ PATH 是 delimited by semicolons instead of colons.)

此外,节点将在以下位置进行搜索:

1: $HOME/. node _ module

2: $HOME/. node _ library

3: $PREFIX/lib/node

其中 $HOME 是用户的主目录,$PREFIX 是节点的 已配置的 node _ prefix。

这主要是出于历史原因 将您的依赖项本地放置在 node _ module 文件夹中 加载速度更快,更可靠。

来源

简而言之: 这是不可能的,因为它似乎永远不会得到支持(见这里 https://github.com/npm/npm/issues/775)。

There are some hacky work-arrounds with using the CLI or ENV-Variables (see the current selected answer), .npmrc-Config-Files or npm link - what they all have in common: They are never just project-specific, but always some kind of global Solutions.

对我来说,没有一个解决方案是真正干净的,因为你的项目贡献者总是需要创建一些特殊的配置或有一些特殊的知识-他们不能只是 npm install和它的工作。

So: Either you will have to put your package.json in the same directory where you want your node_modules installed, or live with the fact that they will always be in the root-dir of your project.

我不确定这是不是你想要的,但是我最终还是问了这个问题,因为我无法在我的项目目录中安装 node_modules,因为它安装在一个不支持符号链接(VM“共享”文件夹)的文件系统上。

我发现了以下变通办法:

  1. package.json文件复制到不同文件系统上的临时文件夹
  2. 运行 npm install
  3. 将生成的 node_modules目录复制回项目目录,使用 cp -r --dereference将符号链接展开为副本。

我希望这可以帮助其他人在寻找将 node_modules移动到不同文件系统的方法时遇到这个问题。

其他选择

There is another workaround, which 我在@Charminbear 链接到的 github 问题上找到的, but this doesn't work with grunt because it does not support NODE_PATH as per https://github.com/browserify/resolve/issues/136:

让我们假设你有 /media/sf_shared,你不能安装符号链接 这意味着实际上不能从 因为有些模块使用符号链接。

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json(您可以在这里使用符号链接 方向,只是不能在/media/sf _ share 中创建一个)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js

Yarn 支持这一特性:

# .yarnrc file in project root
--modules-folder /node_modules

但是您的体验可以根据您使用的软件包而有所不同。我不确定你想不想进那个兔子洞。

如果我在 docker 中,并且我想要在一个卷中持久化 node_modules,该怎么办?然后,在我的应用程序路径中使用 node_modules对我来说不是一个选项。

当我将新代码部署到容器中时,我将一个 tar 放入其中,将其解压缩到一个临时文件夹,然后将其 rsync 到 app 目录。我为 rsync 设置了 --delete标志,所以不在 tar 中的所有内容都将从 app 文件夹中删除。这也适用于 node_modules文件夹,所以不幸的是,唯一适合我的解决方案如下:

在 app 目录中创建一个符号链接,该链接指向一个包含 node_modules并从主机挂载到容器中的目录。