7

npm 文档是这样说的:

  • 如果您正在安装要在程序中使用的东西,请使用 require('whatever'),然后将其安装在本地项目的根目录下。
  • 如果您要在 shell、命令行或其他地方安装要在 shell 中使用的东西,请全局安装它,以便它的二进制文件最终出现在您的 PATH 环境变量中。

我目前正在编写 --- 或者至少正在尝试编写 --- 在节点中的真正命令行程序,该程序旨在从 shell 中使用。因此,根据上述情况,我的依赖项应该安装为全局模块。

我如何在节点中实际使用通过 npm 安装的全局模块?当然,调用require()不起作用,因为/usr/local/lib/node_modules默认情况下 npm 全局模块目录 ( ) 不在路径上。我可以通过将其显式添加到程序顶部的路径来使其工作,但这是一个非常糟糕的解决方案,因为它不可移植——它需要知道 npm 的全局模块目录在任何给定系统上的位置。

只是为了让生活更加糟糕,我通过 dpkg 安装了一些全局模块。这些已被放入/usr/lib/nodejs,并且它们可以正常工作。这让我很困惑,因为如果不应该将全局模块用于普通应用程序,我不希望它们都在路径上;否则我希望他们都在路上,并要求全局模块在任何地方都可以工作。有一个但没有另一个似乎很奇怪。这里发生了什么?

更新:我应该指出,这个程序只是一个脚本,#!/usr/bin/env nodejs在顶部;它不是一个正式的节点模块,这对于如此微不足道的事情来说太过分了。由于 Debian 模块在这样的脚本中都是必需的,对我来说 npm 的全局模块也应该是必需的似乎是明智的,但我有一种感觉,这是 Debian 主义......

4

3 回答 3

4

因此,根据上述情况,我的依赖项应该安装为全局模块。

不完全的。

这意味着您的模块可以作为全局安装,因此它的二进制文件可以从 shell 中获得:

npm install -g your-module
your-module-binary --option etc.

另一方面,它的依赖项应该在第一点之后安装,驻留在node_modules项目中的一个目录中(通常在一个可以管理它们的目录中指定package.jsonnpm

但是,全局模块(通常)不适用于require. 它们不遵循从文件夹加载node_modulesnpm本地模块遵循,并且它们的路径通常不在从全局文件夹加载NODE_PATH的变量中列出。

于 2012-09-25T16:18:59.997 回答
1

因此,您的说明与 npm 模块有关,但您正在进行本地开发。这里有一些指导方针。

就您的源代码而言,您只需要两种类型的require语句

var dep = require('somedep')

将它用于您的库需要通过 npm 包含的任何核心模块(如fs)和第三方模块(在您的 package.json 中将它们列为依赖项)。在这里您指定一个不合格的包名称,节点根据其搜索算法查找模块。

var mymod = require('./lib/mymod')

使用它通过相对于当前 javascript 文件的路径来要求项目本身中的其他模块。

这就是您处理 javascript 依赖项所需要做的一切。

好的,现在如何安装依赖项?

对于本地开发(在您的项目的源代码树中),只需 cd 进入项目目录并运行npm install,它将读取您的package.json文件并在node_modules子目录中安装您需要的模块,一切都将适用于本地开发。

如果您要将它实际发布为 npm 模块,其他用户(并且您可以是开发人员和“其他用户”之一)npm -g如果他们想要访问您的项目的二进制实用程序,PATH则可以安装它包括/usr/lib/nodejs/lib/node_modules,但在这种情况下,npm -g将同时安装您的代码和项目的依赖项。

这就是你感到困惑的地方。

因此,根据上述情况,我的依赖项应该安装为全局模块。

您不需要将依赖项显式安装为全局变量,只需要您感兴趣的顶级模块,在这种情况下就是您的项目本身。npm 将自动处理依赖关系,这是它在生活中的主要目的。你的项目的依赖项不会被全局安装,而是在node_modules你的项目的子目录中,它将被全局安装。

这是目录和那里的内容:

  • ~/yourproject:源代码的本地开发
  • ~/yourproject/node_modules: 项目在开发过程中使用的 npm 模块。npm install通过运行创建/填充~/yourproject
  • /usr/lib/nodejs/lib/node_modules:全局安装的 npm 模块(如果您将其发布到 npm 注册表,最终可能包括您的项目)
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules:当您这样做时,您的项目的依赖项将安装在这里npm install -g yourproject

您还可以找到我关于管理解释器和 PATH相关的博客文章。

于 2012-09-25T15:40:50.453 回答
0

此外,Node.js 将在以下 GLOBAL_FOLDERS 列表中搜索:

1:$HOME/.node_modules 2:$HOME/.node_libraries 3:$PREFIX/lib/node

于 2022-01-26T02:56:37.740 回答