访问一个node.js全局模块

npm文档说:

  • 如果您正在安装您要在程序中使用的东西,请使用require('whatever'),然后将其安装到您的项目的根目录。
  • 如果你正在安装你想在你的shell中使用的东西,在命令行或者其他地方安装,那么它的二进制文件就会在你的PATH环境variables中。

我正在编写—或者至less是试图编写—一个真正的命令行程序在节点中的目的是要从shell使用。 因此,根据以上所述,我的依赖应该被安装为全局模块。

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

只是为了让生活更加恶化,我有一些通过dpkg安装的全局模块。 这些已经放在/usr/lib/nodejs ,而且它们只是工作。 这使我感到困惑,因为如果全局模块不应该用于普通应用程序,那么我预计不会在路上; 否则我会希望他们都在路上,并要求全球模块到处工作。 有一个,但不是另一个似乎很奇怪。 这里发生了什么?

更新:我应该指出,这个程序只是一个脚本,顶部有#!/usr/bin/env nodejs ; 它不是一个正式的节点模块,对于一些相当微不足道的东西来说,这是过度的。 由于Debian模块都可以从这样的脚本中得到,所以对我来说npm的全局模块也是必须的,但我觉得这是一个Debian …

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

不完全的。

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

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

另一方面,它的依赖关系应该在第一点之后安装,驻留在项目的node_modules目录中(通常在package.json指定,以便npm可以pipe理它们)。

但是,全局模块不是(通常) require 。 它们不遵循从node_modules文件夹加载的 npm遵循的本地模块,其path通常NODE_PATHvariables中列出,用于从全局文件夹加载 。

所以说明你有关于npm模块,但是你正在做本地开发。 这里有一些指导方针。

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

 var dep = require('somedep') 

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

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

使用这个命令,通过相对于当前JavaScript文件的path来要求项目中的其他模块。

这就是所有你必须做的来处理你的JavaScript依赖关系。

好吧,现在你如何安装你的依赖关系?

对于本地开发(在项目的源代码树中),只需cd进入项目目录并运行npm install ,它将读取你的package.json文件,并将所需的模块安装到node_modules子目录中,这对所有本地开发都是很好的。

如果你真的把它作为npm模块发布,其他用户(你既可以是开发者也可以是“其他用户”),如果他们想要访问你的项目的二进制工具,可以用npm -g安装PATH ,它需要包含/usr/lib/nodejs/lib/node_modules ,但是在这种情况下, npm -g会同时处理你的代码和项目的依赖关系。

这是你感到困惑的地方。

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

您不需要显式地将依赖项安装为全局variables,只需要您感兴趣的顶级模块,本例中就是您的项目本身。 npm将自动处理依赖关系,这是它生命中的主要目的。 您的项目的依赖关系不会全局安装,而是将安装在您的项目的node_modules子目录中,这将在全局安装。

这里是目录和生活在那里:

  • ~/yourproject :本地开发你的源代码
  • ~/yourproject/node_modules :开发过程中项目使用的npm模块。 通过在~/yourproject运行npm install来创build/填充
  • /usr/lib/nodejs/lib/node_modules :在全局安装的npm模块(如果你将它发布到npmregistry,最终可能包含你的项目)
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules :当你执行npm install -g yourproject时,你的项目依赖将会被安装

你也可以find我的博客文章pipe理口译员和path相关。