NodeJS需要一个全局模块/包

我试图在全球范围内安装,然后forever使用,像这样:

npm install -g forever forever-monitor

我看到通常的输出,以及将文件复制到全局path的操作,但是如果我试图require("forever"); 我得到一个错误,说该模块没有find。

我使用节点和npm的最新版本,我已经知道npm在全局和本地安装的变化,但我真的不想在每个项目上安装本地化,我正在一个平台上工作不支持link所以全球安装后npm link对我来说是不可能的。

我的问题是:为什么我不能要求全球安装的软件包? 这是一个function或错误? 还是我做错了什么?

PS:只是为了说明问题:我不想在本地安装。

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

你可以通过设置NODE_PATH环境variables来解决这个问题。 在Linux中,这将是: export NODE_PATH=/usr/lib/node_modules (这取决于您的全局模块实际安装在哪里)。

请参阅: http : //nodejs.org/api/modules.html#modules_loading_from_the_global_folders

在全局安装软件包之后,您必须将本地项目与全局程序包关联起来

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

看到这里

道歉为necromancy,但我能够指定硬链接到全球安装的模块:

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

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

你可以使用包requireg来解决这个问题:

 var forever = require('requireg')('forever') 

会做的伎俩。

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

我知道这是一个老问题,但是我试图在package.jsonpreinstall脚本中使用semver进行版本检查时遇到了这个问题。 因为我知道我不能依赖任何安装的本地模块,所以我使用它来从全局的node_modules文件夹中请求semver (因为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); } 

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

我没有像其他人所build议的那样使用NODE_PATH解决scheme,因为我希望在任何人的机器上都能使用这个解决scheme,而无需在为我的项目运行npm install之前需要额外的configuration/设置。

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

希望这对某人有用。