繁体   English   中英

在 package.json 中指定 node_modules 的路径

[英]Specify path to node_modules in package.json

有没有办法移动应用程序中的 node_modules 目录,让我们说 /vendor/node_modules 就像 bower 对 bowerrc 文件所做的那样? 我认为它可以在 package.json 中指定,但我似乎找不到解决方案。 非常感谢您的帮助。

是的,你可以,只需设置 NODE_PATH 环境变量:

export NODE_PATH='yourdir'/node_modules

根据文档:

如果 NODE_PATH 环境变量设置为以冒号分隔的绝对路径列表,则节点将在这些路径中搜索模块,如果它们在其他地方找不到。 (注意:在 Windows 上,NODE_PATH 由分号而不是冒号分隔。)

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

1:$HOME/.node_modules

2:$HOME/.node_libraries

3: $PREFIX/lib/node

其中 $HOME 是用户的主目录,$PREFIX 是节点配置的 node_prefix。

这些主要是出于历史原因。 强烈建议您将依赖项本地放置在 node_modules 文件夹中。 它们将被加载得更快、更可靠。

来源

简而言之:这是不可能的,而且似乎永远不会得到支持(请参阅此处https://github.com/npm/npm/issues/775 )。

使用 CLI 或 ENV 变量(请参阅当前选择的答案)、.npmrc-Config-Files 或npm link有一些棘手的工作 - 它们都有一个共同点:它们从来都不是特定于项目的,而是始终某种global解决方案。

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

所以:要么你必须把你的 package.json 放在你想要安装 node_modules 的同一目录中,要么接受它们总是在你项目的根目录中的事实。

Yarn 支持这个特性:

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

但是您的体验可能会因您使用的软件包而异。 我不确定你是否想进入那个兔子洞。

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

我找到了以下解决方法:

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

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

其他选项

还有另一种解决方法,我在 @Charminbear 链接到的 github 问题上找到了它,但这不适用于grunt因为它不支持NODE_PATHhttps://github.com/browserify/resolve/issues/136

假设您有/media/sf_shared并且您无法在其中安装符号链接,这意味着您实际上无法从/media/sf_shared/myproject npm install 因为某些模块使用符号链接。

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

如果我在 docker 中并且我想将node_modules在一个卷中怎么办? 然后,将node_modules放在我的应用程序路径中对我来说不是一个选择。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM