ale*_*nst 136 package node.js npm
我正在尝试全局安装,然后使用forever并forever-monitor像这样:
npm install -g forever forever-monitor
我看到了通常的输出以及将文件复制到全局路径的操作,但是如果我尝试require("forever");得到错误,说明找不到该模块.
我正在使用node和npm的最新版本,我已经知道npm在全局和本地安装中所做的更改,但我真的不想在每个项目上安装localy而且我正在开发一个平台"科技支撑link这么npm link之后全球安装是不可能的我.
我的问题是:为什么我不能要求全局安装包?这是一个功能还是一个bug?或者我做错了什么?
PS:只是为了说清楚:我不想在本地安装.
Dan*_*unu 198
在Node.js中,require不会查找安装了全局模块的文件夹.
您可以通过设置NODE_PATH环境变量来解决此问题.在Linux中,这将是:
export NODE_PATH=/usr/lib/node_modules
Run Code Online (Sandbox Code Playgroud)
注意:这取决于实际安装全局模块的位置.
请参阅:从全局文件夹加载.
use*_*109 91
全局安装包后,必须将本地项目与全局包链接
npm install express -g
cd ~/mynodeproject/
npm link express
Run Code Online (Sandbox Code Playgroud)
看到这里
Tho*_*ham 23
道歉,但我能够指定全局安装模块的硬编码路径:
var pg = require("/usr/local/lib/node_modules/pg");
Run Code Online (Sandbox Code Playgroud)
这并不完美,但考虑到Unity3d试图"编译"项目目录中包含的所有javascript,我真的无法安装任何软件包.
Joe*_*een 19
我知道这是一个老问题,但在尝试做一些版本使用检查时,我就遇到了这个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);
}
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,因为这不需要安装任何特殊模块才能使用.
我没有NODE_PATH像其他人建议的那样使用解决方案,因为我想让它在任何人的机器上运行,而不需要在运行npm install我的项目之前需要额外的配置/设置.
这是编码的方式,它只能保证找到顶级模块(使用安装npm install -g ...)或所需的模块npm(在dependencies此列出:https://github.com/npm/npm/blob/master/package.json).如果您使用的是较新版本的NPM,它可能会找到其他全局安装的软件包的依赖关系,因为node_modules现在文件夹的结构比较扁平.
希望这对某人有用.
JP *_*son 15
您可以使用该包requireg来解决此问题:
var forever = require('requireg')('forever')
Run Code Online (Sandbox Code Playgroud)
会做的.
另外,还有另一个模块,global-npm虽然只是使用全局npm,但您可以查看短代码并查看该技术的工作原理.
ken*_*orb 14
根据文档,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
Run Code Online (Sandbox Code Playgroud)
注意:前缀对应于--prefix构建期间的参数,它与...相关process.execPath.不要混淆npm config get prefix命令的值.资源
如果找不到给定的模块,则意味着它不存在于上述位置之一中.
安装模块的全局根文件夹的位置可以通过以下方式打印:( npm root -g默认情况下,路径是在运行时计算的,除非在npmrc文件中被覆盖).
您可以尝试以下变通方法:
在NODE_PATH环境变量中指定全局模块位置.例如
echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
Run Code Online (Sandbox Code Playgroud)
要测试并打印其值NODE_PATH,请运行:
echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
Run Code Online (Sandbox Code Playgroud)要获得更持久的解决方案,请$HOME/.node_modules通过运行以下命令将全局用户文件夹链接到指向根文件夹:
ln -vs "$(npm root -g)" "$HOME"/.node_modules
Run Code Online (Sandbox Code Playgroud)
然后通过:echo 'require("forever")' | nodecommand 重新测试它.
在调用脚本之前,临时将当前文件夹更改为全局安装扩展的位置.例如
npm install -g forever
cd "$(npm root -g)"
echo 'require("forever")' | node
cd -
Run Code Online (Sandbox Code Playgroud)在npmuserconfig文件中配置全局安装目标(请参阅:)npm help 5 npmrc或通过userconfigparam(--prefix)配置.
要显示当前配置,请运行:npm config list.
要编辑当前配置,请运行:npm config edit.
调用时指定节点模块位置的完整路径require().例如
require("/path/to/sub/module")
Run Code Online (Sandbox Code Playgroud)将包安装到自定义位置,例如
npm install forever -g --prefix "$HOME"/.node_modules
Run Code Online (Sandbox Code Playgroud)
但是,安装将进入~/.node_modules/lib/node_modules/,因此仍需要添加位置.
请参阅:npm本地安装包到自定义位置
从全局包的位置在当前文件夹中创建符号链接.例如
npm link forever
Run Code Online (Sandbox Code Playgroud)Chr*_*ois 10
对于依赖于大模块的 CLI 实用程序,例如puppeteer,我喜欢生成 anpm 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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73988 次 |
| 最近记录: |