我正在尝试全局安装,然后像这样使用forever
和forever-monitor
:
npm install -g forever forever-monitor
我看到了通常的输出以及将文件复制到全局路径的操作,但是如果我尝试require("forever");
,我会收到一条错误消息,说明找不到该模块。
我正在使用node和npm的最新版本,我已经知道npm在全局和本地安装中所做的更改,但我真的不希望在每个项目上安装localy我正在开发一个不支持link
的平台,所以npm link
在我无法进行全局安装之后。
我的问题是:为什么我不能要求全局安装的包?这是一个功能还是一个bug?或者我做错了什么?
PS:只是为了说清楚:我不想在本地安装。
答案 0 :(得分:176)
在Node.js中,require不会查找安装了全局模块的文件夹。
您可以通过设置NODE_PATH环境变量来解决此问题。在Linux中,这将是:
export NODE_PATH=/usr/lib/node_modules
注意:这取决于实际安装全局模块的位置。
答案 1 :(得分:88)
答案 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默认会搜索以下位置:
NODE_PATH
环境变量中指定的路径。
注意:NODE_PATH
环境变量设置为以冒号分隔的绝对路径列表。
当前node_modules
文件夹。(本地)
$HOME/.node_modules
(全球)
注意:$HOME
是用户的主目录。
$HOME/.node_libraries
(全球) $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
如果找不到给定的模块,则表示它不存在于上述某个位置。
安装模块的全局根文件夹的位置可以通过以下方式打印: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/
下,因此仍需要添加位置。
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
使用全局路径。