NPM 全局安装仍在创建 node_modules 目录

NPM global install still creating a node_modules directory

在 Ubuntu 中,我有一个包含代码 /code 的目录,其中包含我的 packages.json 等。我的 NPM 前缀是 /usr 通过 npm prefix -g。我正在尝试全局安装软件包,以便不在 /code 中创建 node_modules 目录,但实际上只要 node_modules 不在 /code 中,它也可以工作。

/code 时,我 运行 npm install -g。我看到在我的全局前缀(例如,/usr/lib/node_modules/.staging)下创建了一个 .staging 目录,但随后 NPM 采取了另一个步骤并开始创建一个 /code/node_modules 目录。

如果我只是 运行 npm install -g <package>,它会正确地以 /usr/lib/node_modules/<package> 结束。但是我不想 运行 npm install -g <package> 我需要的每个包裹。

为什么 NPM 这样做,我怎样才能让它停止这样做?至少,我希望 node_modules 目录不在我的 /code 目录中(这是由于某些我无法更改的环境限制)。

全局安装的包(几乎总是)不会被您的代码使用。这不是 nodenpm(通常)的工作方式。没有所有程序都查看的共享全局 node_modules。(好吧,有一点,但如果可以避免,你不想使用它。继续阅读。)有一个本地 node_modules 帮助您避免依赖地狱。全局模块适用于最终出现在 PATH 之类的 CLI 工具。

你没有解释为什么你的项目不需要本地 node_modules,所以我会提到,如果它只是因为它以某种方式困扰你,那么请拜托请克服它.你会快乐得多。输入 npm install 并继续。

也就是说,由于遗留原因,如果没有 /code/node_modules,您在 /code 中的代码将在 /node_modules 中查找。对于使用 require() 的 CommonJS 模块来说是这样。如果您通过 import 使用 ESM 模块,您可能需要阅读文档。

因此,如果您使用的是 CommonJS/require(),您的目录结构可能类似于 /project-name/code。您可以将 index.js 或任何其他代码放在 code 子目录中,而您的 package.json 可能位于 project-name 中。 运行 npm install 来自 /project-name 并且它将在那里创建一个 node_modules 目录而不是在 code 子目录中,并且您的 Node.js 文件在 code 会找到那些模块。

如果您不喜欢,那么对于其他选项,您可以查看 relevant docs。在撰写本文时,这些选项包括 NODE_PATH 环境变量、$HOME/.node_modules$HOME/.node_libraries$PREFIX/lib/node。然而,这一切都伴随着这个警告,如果可以的话,我恳请你遵守:

It is strongly encouraged to place dependencies in the local node_modules folder. These will be loaded faster, and more reliably.