- 如果你要安装的东西是用来在程序中使用的,比如 require('whatever'),那么请在项目的根目录下本地安装
- 如果你要安装的东西是用来在shell命令行中使用的,则需要全局安装,这样它的二进制文件就会被加入到PATH环境变量中去
并非完全如此。
这意味着您的模块可以作为全局安装,以便其二进制文件可以从shell中使用:
npm install -g your-module
your-module-binary --option etc.
而另一方面,它的依赖应该在第1点后安装,在您的项目中的node_modules
目录中(通常在package.json
中指定,以便npm
进行管理)。
但是,全局模块不会(通常)对require
可用。 它们不遵循从node_modules
文件夹加载,这是npm
用于本地模块的方式,并且它们的路径通常不列在NODE_PATH
变量中以进行从全局文件夹加载。
所以你现在的指令是关于npm模块的,但你正在进行本地开发。以下是一些指南。
就你的源代码而言,你只需要两种类型的require
语句。
var dep = require('somedep')
对于任何核心模块(如fs
)和您的库需要通过npm包含的第三方模块(在package.json中列出它们作为依赖项),请使用此选项。在这里,您指定一个未经限定的软件包名称,Node会根据其搜索算法找到该模块。
var mymod = require('./lib/mymod')
使用此方法,通过相对于当前JavaScript文件的路径在项目中引用其他模块。
这就是处理JavaScript依赖项所需做的全部操作。
好了,现在该如何安装您的依���项呢?
对于本地开发(在项目源树内),只需进入项目目录并运行npm install
即可,在这种情况下,它将读取您的package.json
文件并安装您需要的模块,并将其放置在node_modules
子目录中,以便进行本地开发。
如果您实际上要将其发布为npm模块,则其他用户(您既可以是开发人员又可以是“其他用户”)可以通过npm -g
安装它,以便他们可以在其PATH
上访问您的项目的二进制工具,这将需要包括/usr/lib/nodejs/lib/node_modules
,但在这种情况下,npm -g
将同时处理安装您的代码和项目依赖项。
以下是您感到困惑的地方。
因此,根据上述内容,我的依赖项应该安装为全局模块。
您无需将依赖项显式安装为全局模块,只需安装您所感兴趣的顶级模块,即您的项目本身。npm 将自动处理依赖项,这是它存在的主要目的。您的项目依赖项不会被全局安装,但是会在您的项目的 node_modules
子目录中进行安装,而该目录将全局安装。
以下是目录及其包含内容:
~/yourproject
:源代码的本地开发~/yourproject/node_modules
:在开发过程中由您的项目使用的 npm 模块。通过在 ~/yourproject
中运行 npm install
进行创建/填充/usr/lib/nodejs/lib/node_modules
:安装在全局环境中的 npm 模块(如果您将其发布到 npm 注册表中,则可能最终包括您的项目)/usr/lib/nodejs/lib/node_modules/yourproject/node_modules
:当您执行 npm install -g yourproject
时,您的项目的依赖项将在此处安装您可能也会发现我关于管理解释器和PATH的博客文章相关。
#!/usr/bin/env nodejs
的源文件。它将被固定在/usr/local/bin
中,以供机器上的其他用户使用。强迫用户创建一个本地项目目录,只是为了运行这个脚本是不合理的。考虑到该脚本已经可以使用require()
访问 Debian 全局模块,为什么我不能访问 npm 的模块呢? - David Givennpm install -g yourproject
即可完成安装。如果你在 package.json 中将你的 shell 脚本包装器标记为二进制文件(参见npm help json
),npm 将把它放在正确的位置,以便用户可以运行它。 - Peter Lyonsnpm install
在项目目录内安装它们。现在您可以创建一个包装器脚本,它将cd到您的项目目录,然后运行node,如cd /path/to/project && /usr/lib/nodejs/bin/node ./program.js
。 - Peter Lyons