访问一个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_PATH
variables中列出,用于从全局文件夹加载 。
所以说明你有关于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相关。