【问题标题】:set node.js REPL module paths设置 node.js REPL 模块路径
【发布时间】:2011-05-05 05:19:15
【问题描述】:

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

我知道当我在 Node 的命令行中时我可以将它添加到 require.paths 数组中,但是我想一劳永逸地添加这个全局模块文件夹,以便 Node 将始终在该目录中搜索模块当我从命令行require()他们时。在此先感谢您提供有关使 npm 和 Node 共存的任何帮助和指示!

【问题讨论】:

  • 你使用的是什么版本的 npm?你在命令行上有什么要求?你用的是require("./module");还是require("module");
  • 我使用的是 npm 1.0.5。我在 Node 命令行中使用 require('module')。我使用 -g 选项安装了这些模块,它们进入了全局模块目录,但 Node 由于某种原因不知道这个目录......

标签: node.js npm


【解决方案1】:

好的,我明白了。结合来自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 的全局安装文件夹。

【讨论】:

  • 缺点是这给了你旧的“一切都是全局的”行为,这在 npm 1.0 中是不受欢迎的(当节点没有在 repl 中启动时,全局模块也会添加到路径中)。另一种方法是创建一个专门用于节点 repl 会话的文件夹,并在本地安装所有需要的模块。然后,当我想使用 repl 时,我可以简单地 cd 到该文件夹​​。
  • 它如何赋予“一切都是全局”的行为?
  • 由于您将全局模块路径添加到您的 .bashrc,所有 node 调用都将使用它。我宁愿将全局行为限制在交互式 (repl) 会话中。
【解决方案2】:

该死,我误会了。对此感到抱歉。

回到正题,你可以把这两行放在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

【讨论】:

  • 我已经阅读了 npm 文档,并且了解全局安装和本地安装。这并没有告诉我有关设置 node.js 路径的任何信息。
  • +1。谢谢,rjack,这是一个很好的解决方法。但是您不知道 Node 将用于搜索模块的路径存储在哪里?
【解决方案3】:

全局安装包(通常由命令行使用)

npm install --global PACKAGE_NAME

就我而言,我想将jslint 安装为命令行工具。于是我跑了

npm install --global jslint

这会将软件包安装到

/usr/local/lib/node_modules/

那么,为什么要这么做呢?如果在项目中专门使用软件包,则不应在全局范围内安装它们。

有关更多信息,请查看帮助页面。

npm help install

npm help global

我也在npmFAQ找到它

【讨论】:

    【解决方案4】:

    对此的回复: https://stackoverflow.com/a/5923898/7381355

    您可以将它添加到您的 .bashrc 中,以便在运行 repl 时仅设置 NODE_PATH,因为需要全局模块是一种反模式。

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

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

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

    node_global() {
      NODE_PATH=$(npm root -g) node "$@"
    }
    

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

    【讨论】:

    • 那么你要回答哪个问题,这个问题,还是你链接的那个问题?
    • 我链接到的问题与这个问题相同。我没有足够的代表来评论这个答案。我指的是 Giacomo 提到的问题,即当不在 repl 中时能够要求全局模块。 stackoverflow.com/questions/5892997/… 我的答案与 Giacomo 的答案 stackoverflow.com/a/5908994/7381355 类似,但不需要额外的文件。这有点像两个答案的合并。
    • 因此,您应该在此处提供与该特定问题相关的部分答案,然后在此处提供与其他问题相关的部分答案。即使那里已经接受了一个答案,但这并不意味着您不能添加另一个答案。 (此外,另一个问题的提问者尚未收到有关此新答案的通知,因此无论如何,当它结束时,它对他们几乎没有帮助。)
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 2015-10-29
    • 2018-09-17
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多