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 主义......