NodeJS需要全局模块/包

时间:2013-03-26 11:49:07

标签: node.js package npm

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

npm install -g forever forever-monitor

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

我正在使用node和npm的最新版本,我已经知道npm在全局和本地安装中所做的更改,但我真的不希望在每个项目上安装localy我正在开发一个不支持link的平台,所以npm link在我无法进行全局安装之后。

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

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

8 个答案:

答案 0 :(得分:176)

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

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

export NODE_PATH=/usr/lib/node_modules

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

请参阅:Loading from the global folders

答案 1 :(得分:88)

全局安装软件包后,必须将本地项目与全局软件包

链接
npm install express -g
cd ~/mynodeproject/
npm link express  

请参阅here

答案 2 :(得分:23)

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

var pg = require("/usr/local/lib/node_modules/pg");

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

答案 3 :(得分:18)

我知道这是一个老问题,但在尝试使用semver preinstall脚本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); } 取决于它我知道它&#39} ;那里):

NODE_PATH

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

我没有像其他人建议的那样使用npm install解决方案,因为我希望在任何人的计算机上都可以使用此解决方案,而无需在运行之前需要额外的配置/设置npm install -g ... 1}}用于我的项目。

对此进行编码的方式,只保证找到顶级模块(使用npm安装)或dependencies所需的模块(此处列为node_modules:{{3 }})。如果您使用的是较新版本的NPM,它可能会找到其他全局安装包的依赖关系,因为现在{{1}}文件夹的结构比较扁平。

希望这对某人有用。

答案 4 :(得分:15)

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

[[0, 1786, 0.0126525], [5, 2463, 0.0126525], [5, 2907, 0.0126525], [6, 3068, 0.0126525], [6, 3086, 0.0126525], [6, 3398, 0.0126525], [12, 5468, 0.013], [13, 5531, 0.0127005], [13, 5564, 0.0127005], [13, 5580, 0.0127005]]

会做到这一点。

另外,还有另一个模块global-npm,虽然仅使用全局output = [[value.index([left, right, rho]), element, rho] for element in snplist for key, value in intervals.items() for left, right, rho in value if left <= element <= right] ,但您可以查看short code并了解该技术的工作原理。

答案 5 :(得分:11)

根据documentation,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
    

    注意:前缀在构建期间对应--prefix param,并且它相对于process.execPath。不要与npm config get prefix命令的值混淆。 source

  6. 如果找不到给定的模块,则表示它不存在于上述某个位置。

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

    解决方案

    您可以尝试以下解决方法:

    • NODE_PATH环境变量中指定全局模块位置。 E.g。

      echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
      

      要测试并打印NODE_PATH的值,请运行:

      echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
      
    • 要获得更持久的解决方案,请通过运行此命令将$HOME/.node_modules全局用户文件夹链接到指向根文件夹:

      ln -vs "$(npm root -g)" "$HOME"/.node_modules
      

      然后通过:echo 'require("forever")' | node命令重新测试它。

    • 在调用脚本之前,将当前文件夹临时更改为全局安装扩展的位置。 E.g。

      npm install -g forever
      cd "$(npm root -g)"
      echo 'require("forever")' | node
      cd -
      
    • npm userconfig file(请参阅:npm help 5 npmrc)或userconfig参数(--prefix)中配置全局安装目标。

      要显示当前配置,请运行:npm config list

      要编辑当前配置,请运行:npm config edit

    • 在调用require()时指定node modules location的完整路径。 E.g。

      require("/path/to/sub/module")
      
    • 将软件包安装到自定义位置,例如

      npm install forever -g --prefix "$HOME"/.node_modules
      

      但是,安装将在~/.node_modules/lib/node_modules/下,因此仍需要添加位置。

      请参阅:npm local install package to custom location

    • 来自全局包位置的当前文件夹中的
    • Create a symlink。 E.g。

      npm link forever
      

答案 6 :(得分:2)

对于依赖大型模块(例如puppeteer)的CLI实用程序,我想生成一个npm 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)
}

答案 7 :(得分:1)

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

  

export NODE_PATH =“$(npm config get prefix)/ lib / node_modules”

这将使node使用全局路径。