访问node.js全局模块

时间:2012-09-25 14:45:14

标签: node.js

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

2 个答案:

答案 0 :(得分:4)

  

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

不完全。

这意味着您的模块可以作为全局安装,因此可以从shell获取其binaries

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

另一方面,它的依赖项应该安装在第一点之后,位于项目中的node_modules目录中(通常在package.json中指定,因此npm可以管理它们)。

但是,require(通常)不能使用全局模块。他们没有关注Loading from node_modules foldersnpm关注本地模块,他们的路径通常不会列在Loading from global foldersNODE_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相关。