NodeJS需要全局模块/包

ale*_*nst 136 package node.js npm

我正在尝试全局安装,然后使用foreverforever-monitor像这样:

npm install -g forever forever-monitor

我看到了通常的输出以及将文件复制到全局路径的操作,但是如果我尝试require("forever");得到错误,说明找不到该模块.

我正在使用node和npm的最新版本,我已经知道npm在全局和本地安装中所做的更改,但我真的不想在每个项目上安装localy而且我正在开发一个平台"科技支撑link这么npm link之后全球安装是不可能的我.

我的问题是:为什么我不能要求全局安装包?这是一个功能还是一个bug?或者我做错了什么?

PS:只是为了说清楚:我不想在本地安装.

Dan*_*unu 198

在Node.js中,require不会查找安装了全局模块的文件夹.

您可以通过设置NODE_PATH环境变量来解决此问题.在Linux中,这将是:

export NODE_PATH=/usr/lib/node_modules
Run Code Online (Sandbox Code Playgroud)

注意:这取决于实际安装全局模块的位置.

请参阅:从全局文件夹加载.

  • 在我的Ubuntu 13.10机器上,模块的全局路径与您在此处显示的不同.我不得不使用`export NODE_PATH =/usr/local/lib/node_modules`. (20认同)
  • 或者代替静态路径,即如果您使用 NVM:`NODE_PATH=$(npm root -g)` (12认同)
  • 如果你使用的是Windows 7/8并且没有覆盖任何Node的安装默认值,那么将`NODE_PATH`环境变量设置为`C:\ Users\{USERNAME}\AppData\Roaming \npm \node_modules`可能会有效. (11认同)
  • @WesJohnson只有'%AppData%\npm \node_modules`可以在Windows 10上运行. (5认同)
  • 如果我设置`NODE_PATH`,我可以同时使用全局和本地模块吗? (5认同)
  • 这对我不起作用。我已经将NODE_PATH设置为全局安装的node_modules的确切位置,但是简单的require('module_name')仍然无法正常工作。(使用linux) (2认同)

use*_*109 91

全局安装包后,必须将本地项目与全局包链接

npm install express -g
cd ~/mynodeproject/
npm link express  
Run Code Online (Sandbox Code Playgroud)

看到这里

  • 如果我没有项目怎么办?说`〜/ some-stand-alone-random-nodejs-test.js`.我不想将我的主文件夹变成项目目录.我不想为每个小实验创建新文件夹. (12认同)
  • 我正在不支持链接的平台上运行(正如我的问题所述)http://blog.nodejs.org/2011/04/06/npm-1-0-link/ (2认同)
  • 我真的不想弄乱链接(根本也不想使用符号链接)。我只想全局安装软件包并需要它们。我知道 NPM 是为了避免这种情况而重新设计的,但是要实现这样的目标有多难? (2认同)

Tho*_*ham 23

道歉,但我能够指定全局安装模块的硬编码路径:

var pg = require("/usr/local/lib/node_modules/pg");
Run Code Online (Sandbox Code Playgroud)

这并不完美,但考虑到Unity3d试图"编译"项目目录中包含的所有javascript,我真的无法安装任何软件包.

  • Unity3D不支持JavaScript.它支持类似于JS的语法,用于其Boo解释器/编译器_(Boo是一种类似.NET的.NET语言)_**,它被欺骗性地称为"JavaScript"**.Unity支持的语言更准确的名称是**UnityScript**.因为它甚至不接近同一种语言,所以为网络或Node.js编写的JS几乎都不会在Unity中运行.关于官方Unity wiki差异的更多信息:http://wiki.unity3d.com/index.php/UnityScript_versus_JavaScript (4认同)

Joe*_*een 19

我知道这是一个老问题,但在尝试做一些版本使用检查时,我就遇到了这个semverpreinstall脚本中package.json.因为我知道我不能依赖安装的任何本地模块,所以我使用它来semver从全局node_modules文件夹中获取(npm依赖于它,我知道它在那里):

function requireGlobal(packageName) {
  var childProcess = require('child_process');
  var path = require('path');
  var fs = require('fs');

  var globalNodeModules = childProcess.execSync('npm root -g').toString().trim();
  var packageDir = path.join(globalNodeModules, packageName);
  if (!fs.existsSync(packageDir))
    packageDir = path.join(globalNodeModules, 'npm/node_modules', packageName); //find package required by old npm

  if (!fs.existsSync(packageDir))
    throw new Error('Cannot find global module \'' + packageName + '\'');

  var packageMeta = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json')).toString());
  var main = path.join(packageDir, packageMeta.main);

  return require(main);
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这种方法,因为这不需要安装任何特殊模块才能使用.

我没有NODE_PATH像其他人建议的那样使用解决方案,因为我想让它在任何人的机器上运行,而不需要在运行npm install我的项目之前需要额外的配置/设置.

这是编码的方式,它只能保证找到顶级模块(使用安装npm install -g ...)或所需的模块npm(在dependencies此列出:https://github.com/npm/npm/blob/master/package.json).如果您使用的是较新版本的NPM,它可能会找到其他全局安装的软件包的依赖关系,因为node_modules现在文件夹的结构比较扁平.

希望这对某人有用.


JP *_*son 15

您可以使用该包requireg来解决此问题:

var forever = require('requireg')('forever')
Run Code Online (Sandbox Code Playgroud)

会做的.

另外,还有另一个模块,global-npm虽然只是使用全局npm,但您可以查看短代码并查看该技术的工作原理.

  • 不,它不会解决问题,因为你不能首先要求“requireg”,这就是重点。 (4认同)

ken*_*orb 14

根据文档,Node.js将默认搜索以下位置:

  1. NODE_PATH环境变量中指定的路径.

    注意:NODE_PATH环境变量设置为以冒号分隔的绝对路径列表.

  2. 当前node_modules文件夹.(本地)

  3. $HOME/.node_modules (全球)

    注意:$HOME是用户的主目录.

  4. $HOME/.node_libraries (全球)
  5. $PREFIX/lib/node (全球)

    注意:$PREFIX是Node.js的配置node_prefix.

    要检查当前值node_prefix,请运行:

    node -p process.config.variables.node_prefix
    
    Run Code Online (Sandbox Code Playgroud)

    注意:前缀对应于--prefix构建期间的参数,它与...相关process.execPath.不要混淆npm config get prefix命令的值.资源

如果找不到给定的模块,则意味着它不存在于上述位置之一中.

安装模块的全局根文件夹的位置可以通过以下方式打印:( npm root -g默认情况下,路径是在运行时计算的,除非在npmrc文件中被覆盖).

您可以尝试以下变通方法:


Chr*_*ois 10

对于依赖于大​​模块的 CLI 实用程序,例如puppeteer,我喜欢生成 anpm root -g并使用它来要求全局模块。

try {
  const root = require('child_process').execSync('npm root -g').toString().trim()
  var puppeteer = require(root + '/puppeteer')
} catch (err) {
  console.error(`Install puppeteer globally first with: npm install -g puppeteer`)
  process.exit(1)
}
Run Code Online (Sandbox Code Playgroud)


Lui*_*ulo 6

您可以将此行放入您的.profile文件中:

导出 NODE_PATH="$(npm config 获取前缀)/lib/node_modules"

这将node使用全局路径。