故宫文档这样说:访问一个Node.js的全球模块
- 如果你安装你想要在你的程序中使用的东西,使用 需要(“不管”),然后安装它在本地,在您的项目的根源。
- 如果您正在安装某些要在shell中使用的东西,请在命令行或 上进行全局安装,以使其二进制文件最终位于PATH环境变量中。
我目前正在写---或者,至少,尝试写---从外壳使用节点真正的命令行程序的预期。因此,根据以上所述,我的依赖应该被安装为全局模块。
我怎么实际上使用一个全局模块安装npm在节点?当然,调用require()
不起作用,因为默认情况下npm全局模块目录(/usr/local/lib/node_modules
)不在路径上。我可以通过将它明确地添加到程序顶部的路径来使其工作,但这是一个非常糟糕的解决方案,因为它不是可移植的 - 它需要了解npm的全局模块目录在任何给定系统上的位置。
只是为了让生活更加恶化,我通过dpkg安装了一些全局模块。这些已被放入/usr/lib/nodejs
,他们只是工作。这使我感到困惑,因为如果全局模块不应该用于普通应用程序,那么我预计不会在路上;否则我会期望他们都走在路上,并要求全球模块到处工作。有一个而不是另一个似乎很奇怪。这里发生了什么?
更新:我应该指出,这个程序只是一个脚本,顶部是#!/usr/bin/env nodejs
;它不是一个正式的节点模块,对于一些相当微不足道的东西来说这太过于夸张了。由于所有Debian模块都需要这样的脚本,因此我认为npm的全局模块应该也是必需的,但我有一种感觉,那就是Debianism ...
是的,但这只适用于重量级项目,这不是:这实际上是一个shell脚本,顶部带有'#!/ usr/bin/env nodejs'的源文件。它将被卡在'/ usr/local/bin'中以供机器上的其他用户使用。强制用户创建一个本地项目目录,以便它们可以运行这是不合理的。考虑到脚本已经可以通过'require()'获得Debian全局模块,为什么我不能使用npm? –
你让开发者感到困惑。对于用户,您将模块发布到npm注册表,并且用户只需键入'npm install -g yourproject'并完成。如果你在你的package.json中将shell脚本封装器标记为二进制文件(请参阅'npm help json'),npm将把它放在正确的位置,以便用户可以运行它。 –
但我没有一个模块,这是我的观点。没有package.json,也没有shell脚本包装器。我知道我不需要有一个模块来做到这一点,因为如果我试图访问Debian安装的所有节点模块都可以。这只是npm的不起作用。我开始怀疑npm不支持这个用例,并且Debian已经摆弄他们的节点设置来明确地完成这个工作。这看起来似乎合理吗? –