npm文档说明了这一点:
- 如果您正在安装要在程序中使用的内容,请使用 require('whatever'),然后在项目的根目录下在本地安装。
- 如果要安装要在shell中使用的内容,请在命令行或 某事,全局安装,以便它的二进制文件最终在你的PATH环境变量中。
我目前正在编写---或者,至少尝试编写---一个真正的命令行程序,该程序旨在从shell中使用。因此,根据以上所述,我的依赖项应该作为全局模块安装。
如何实际使用在节点中使用npm安装的全局模块?当然,调用require()
不起作用,因为默认情况下npm全局模块目录(/usr/local/lib/node_modules
)不在路径上。我可以通过明确地将它添加到程序顶部的路径来使其工作,但这是一个非常糟糕的解决方案,因为它不可移植 - 它需要知道npm的全局模块目录在任何给定系统上的位置。
为了让生活更加恶化,我通过dpkg安装了一些全局模块。这些已被放入/usr/lib/nodejs
,它们只是起作用。这让我感到困惑,因为如果全局模块不应该用于普通的应用程序,我希望它们不会在路径上;或者我希望他们都在路上,并要求全球模块在任何地方工作。拥有一个而不是另一个似乎很奇怪。这是怎么回事?
更新:我应该指出,这个程序只是一个脚本,顶部有#!/usr/bin/env nodejs
;它不是一个正式的节点模块,这对于一些非常微不足道的东西来说太过分了。由于Debian模块都需要这样的脚本,我觉得npm的全局模块也应该是必需的,但我觉得这是一个Debianism ......
答案 0 :(得分:4)
因此,根据以上所述,我的依赖项应该作为全局模块安装。
不完全。
这意味着您的模块可以作为全局安装,因此可以从shell获取其binaries:
npm install -g your-module
your-module-binary --option etc.
另一方面,它的依赖项应该安装在第一点之后,位于项目中的node_modules
目录中(通常在package.json
中指定,因此npm
可以管理它们)。
但是,require
(通常)不能使用全局模块。他们没有关注Loading from node_modules
folders,npm
关注本地模块,他们的路径通常不会列在Loading from global folders的NODE_PATH
变量中。
答案 1 :(得分:1)
所以你有关于npm模块的说明,但是你正在进行本地开发。以下是一些指导原则。
就源代码而言,您只需要两种类型的require
语句
var dep = require('somedep')
将此用于任何核心模块(如fs
)和您所需的第三方模块(通过npm包含它们)(将它们列在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
将处理您的代码和项目的安装问题。 #39; s依赖性一次性。
在这里你会感到困惑。
因此,根据以上所述,我的依赖项应该作为全局模块安装。
您不需要将依赖项显式安装为全局变量,只需要您感兴趣的顶级模块,在本例中是您的项目本身。 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
您可能还会发现my blog post on managing interpreters and the PATH相关。