2011-05-05 110 views
17

我找不出如何添加路径到我的Node.js安装(Mac OS X上的v.0.4.7)。我已经安装了npm,它安装到全球/usr/local/lib/node_modules。然而,当我安装了npm时,它并没有通知Node它选择放置全局模块的位置(应该有吗?)。现在,当我在命令行模式下使用Node时,我不能简单地使用全局安装的模块require()。所以,我想知道是否有某种节点配置文件或环境变量,我可以添加我的全局npm模块安装路径?set node.js REPL模块路径

我知道我可以在Node的命令行中将它添加到require.paths数组中,但我希望一次性添加此全局模块文件夹,以便Node始终在模块中搜索该目录我从他们的命令行中获得了require()。预先感谢有关使npm和Node共存的任何帮助和指示!

+0

你使用的是什么版本的npm?你如何在命令行上要求?你使用'require(“./ module”);'或'require(“module”);'? – Giacomo 2011-05-05 07:36:43

+0

我使用npm 1.0.5。我在Node命令行中使用了require('module')'。我用'-g'选项安装了这些模块,并且它们进入了全局模块目录,但由于某种原因,Node不知道这个目录... – ampersand 2011-05-05 17:02:13

回答

16

好的,我明白了。结合http://nodejs.org/docs/v0.4.7/api/modules.html#file_Moduleshttps://github.com/isaacs/npm/blob/master/doc/faq.md#readme的信息很明显,Node检查模块时会检查NODE_PATH环境变量。要做到这一点,我做了以下事情:

echo 'export NODE_PATH="'$(npm root -g)'"' >> ~/.bashrc 

这将NODE_PATH设置为npm的全局安装文件夹。

+1

缺点是,这会给你旧的“一切都是全局的”行为,这被视为npm 1.0(当节点没有在repl中启动时,全局模块被添加到路径中)。另一种方法是将文件夹专用于节点repl会话,并在本地安装所有需要的模块。然后当我想使用repl时,我可以简单地cd到该文件夹​​。 – Giacomo 2011-05-07 23:04:17

+0

它如何给“一切都是全球性的”行为? – ampersand 2011-05-07 23:38:05

+1

由于您已将全局模块路径添加到.bashrc,因此所有'node'调用都将使用它。我宁愿将全球行为限制在交互式(repl)会话中。 – Giacomo 2011-05-10 13:54:23

4

该死的,我误解了。对于那个很抱歉。

回到主题,你可以把这两行set-repl-paths.js

require.paths.unshift('/usr/lib/node_modules'); 
require("repl").start(); 

然后执行node set-repl-paths.js你将不得不与已经设置好的路径一个REPL。你可以写一个简单的bash脚本或者设置一个shell别名,这样你只需键入node-repl或类似的东西。

对于npm 1.x,您应该使用本地安装,并为提供命令行工具的模块进行全局安装。

如果你真的想全局安装模块 foo,那么在你的模块文件夹中发出一个 npm link foo。现在您可以在模块中使用 require("foo")

最佳做法是使用本地安装。

请参阅nodejs博客上的 npm 1.0: Global vs Local installation

+0

我已经通过了npm文档,并且知道全局vs本地安装。这并没有告诉我有关设置node.js路径的任何信息。 – ampersand 2011-05-06 16:09:40

+0

哎呦。答案已更新。 – Giacomo 2011-05-06 20:07:45

+0

+1。谢谢,rjack,这是一个很好的解决方法。但是你不知道Node在哪里存储它用于搜索模块的路径? – ampersand 2011-05-07 20:05:49

2

要安装包全局(通常所用的命令行)

npm install --global PACKAGE_NAME

在我的情况下,我想安装jslint作为命令行工具。于是我就

npm install --global jslint

这将安装包

/usr/local/lib/node_modules/

那么,为什么这一切?如果在项目中专门使用包,则不应该在全局安装包。

欲了解更多信息,请访问帮助页面。

npm help install

npm help global

我还发现它在npmFAQ

0

在回答这个: https://stackoverflow.com/a/5923898/7381355

你可以到你的.bashrc添加此只设置NODE_PATH时运行repl因为需要全局模块是一种反模式。

node() { 
    if (($# == 0)); then 
    NODE_PATH=$(npm root -g) command node 
    else 
    command node "[email protected]" 
    fi 
} 

当没有参数传递给节点时,它设置NODE_PATH。所以它不适用于node -i之类的东西。你将不得不添加更多的参数检查来覆盖所有运行repl的情况。

这会使repl始终设置NODE_PATH。如果您希望能够选择是否运行带有全局模块的repl或脚本,则可以将其添加到.bashrc中。

node_global() { 
    NODE_PATH=$(npm root -g) node "[email protected]" 
} 

然后运行node_global。我去了第二个选项。

+0

那么你回答哪个问题,这个问题还是你链接的问题? – 2017-01-05 22:52:31

+0

我所关联的问题与此相同。我没有足够的代表评论这个答案。我指的是Giacomo提到的关于在没有repl时能够需要全局模块的问题。 http://stackoverflow.com/questions/5892997/set-node-js-repl-module-paths/5923898#comment6824095_5923898 我的答案类似于贾科莫的答案http://stackoverflow.com/a/5908994/7381355 但它不需要额外的文件。这有点像两个答案的合并。 – dosentmatter 2017-01-10 20:19:16

+0

因此,您应该做的是提供与此特定问题相关的答案部分,然后提供与其他问题相关的部分答案。即使答案已经在那里被接受,这并不意味着你不能再添加一个答案。 (另外,另一个问题的提问者还没有收到关于这个新答案的通知,所以当它结束时,它无助于他们。) – 2017-01-10 22:02:45