我试图在全球范围内安装,然后使用forever
和forever-monitor
是这样的:
npm install -g forever forever-monitor
我看到常用的输出,也将文件复制到全局路径的操作,但当时如果我尝试require("forever");
我得到一个错误说,该模块没有被发现。
我使用的是最新版本的两个节点和NPM和我已经知道有关故宫在全球VS本地安装进行了更改,但我真的不希望在每个项目localy安装和我正在那并不是一个平台上“T支持link
,以便npm link
后,一个全球性的安装是不可能的我。
我的问题是:为什么我不能要求一个全球安装包? 那是一个功能或一个错误? 还是我做错了什么?
PS:只是为了使它更清楚:我不想在本地安装。
在Node.js的,需要全球哪里模块的安装文件夹中的不看。
您可以通过设置NODE_PATH环境变量解决这个问题。 在Linux中,这将是:
export NODE_PATH=/usr/lib/node_modules
注意:这个取决于您的全球模块实际安装。
请参阅: 从全球的文件夹加载 。
在安装包后在全球您必须链接与全局包本地项目
npm install express -g
cd ~/mynodeproject/
npm link express
见这里
道歉的巫,但我可以指定在全球范围内安装的模块硬编码路径:
var pg = require("/usr/local/lib/node_modules/pg");
这不是完美的,但考虑到Unity3d试图“编译”包含在我实在无法安装任何包项目目录中的所有的JavaScript。
我知道这是一个老问题,但在尝试做一些版本使用检查时,我就遇到了这个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);
}
我喜欢这种做法,因为这并不需要任何特殊的模块才能使用的安装。
我没有用去NODE_PATH
解决方案像其他人所说,因为我想获得此人的机器上工作,而不必在运行之前需要额外的配置/设置npm install
为我的项目。
这是编码的方式,它只能保证找到顶层模块(使用安装npm install -g ...
),或通过所需的模块npm
(列为dependencies
在这里: https://github.com/npm/npm/斑点/主/的package.json )。 如果您正在使用NPM的更新版本,它可能会发现其他全球已安装的软件包的依赖关系,因为有一个平坦的结构node_modules
文件夹现在。
希望这是有用的人。
您可以使用包requireg
来解决这个问题:
var forever = require('requireg')('forever')
会做的伎俩。
此外,还有另一个模块, global-npm
,而具体到只是利用全球npm
,你可以看看短代码 ,看到了技术是如何工作的。
按照文件 ,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
命令。 资源
如果无法找到给定的模块,这意味着它不存在于上述位置之一。
:其中模块被安装全球根文件夹的位置可以由被打印npm root -g
(默认的路径被在运行时计算,除非在重写npmrc
文件 )。
解
你可以尝试以下解决方法:
指定在全局模块位置NODE_PATH
环境变量。 例如
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
echo 'require("forever")' | node
命令。
临时改变当前文件夹到扩展已在全球安装,调用脚本之前。 例如
npm install -g forever cd "$(npm root -g)" echo 'require("forever")' | node cd -
配置在全球安装目标npm
UserConfig的文件 (见: npm help 5 npmrc
)或userconfig
参数( --prefix
)。
要显示当前配置,运行: npm config list
。
编辑当前的配置,运行: npm config edit
。
指定的完整路径节点模块的位置打电话时require()
例如
require("/path/to/sub/module")
将此程序包安装到自定义位置,如
npm install forever -g --prefix "$HOME"/.node_modules
但是,安装会在~/.node_modules/lib/node_modules/
,所以位置仍然需要添加。
请参阅: NPM本地安装包到自定义位置
创建符号链接从全局包的位置在当前文件夹中。 例如
npm link forever
对于依赖于大模块CLI公用设施,像puppeteer
,我喜欢酿出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)
}
你可以把这个线在你.profile
文件:
出口NODE_PATH = “$(NPM配置get前缀)/ lib目录/ node_modules”
这将使得node
使用全局路径。