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.json
的preinstall
脚本中使用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
文件夹结构。
希望这对某人有用。