需要的NodeJS全局模块/包(NodeJS require a global module/pac

2019-07-23 12:29发布

我试图在全球范围内安装,然后使用foreverforever-monitor是这样的:

npm install -g forever forever-monitor

我看到常用的输出,也将文件复制到全局路径的操作,但当时如果我尝试require("forever"); 我得到一个错误说,该模块没有被发现。

我使用的是最新版本的两个节点和NPM和我已经知道有关故宫在全球VS本地安装进行了更改,但我真的不希望在每个项目localy安装和我正在那并不是一个平台上“T支持link ,以便npm link后,一个全球性的安装是不可能的我。

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

PS:只是为了使它更清楚:我不想在本地安装。

Answer 1:

在Node.js的,需要全球哪里模块的安装文件夹中的不看。

您可以通过设置NODE_PATH环境变量解决这个问题。 在Linux中,这将是:

export NODE_PATH=/usr/lib/node_modules

注意:这个取决于您的全球模块实际安装。

请参阅: 从全球的文件夹加载 。



Answer 2:

在安装包后在全球您必须链接与全局包本地项目

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

见这里



Answer 3:

道歉的巫,但我可以指定在全球范围内安装的模块硬编码路径:

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

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



Answer 4:

我知道这是一个老问题,但在尝试做一些版本使用检查时,我就遇到了这个semverpreinstall脚本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文件夹现在。

希望这是有用的人。



Answer 5:

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

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

会做的伎俩。

此外,还有另一个模块, global-npm ,而具体到只是利用全球npm ,你可以看看短代码 ,看到了技术是如何工作的。



Answer 6:

按照文件 ,Node.js的将默认情况下在以下位置搜索:

  1. 在指定的路径NODE_PATH环境变量

    注: NODE_PATH环境变量设置为绝对路径的冒号分隔的列表。

  2. 当前node_modules文件夹。 (本地)

  3. $HOME/.node_modules (全球)

    注意: $HOME是用户的主目录。

  4. $HOME/.node_libraries (全球)
  5. $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 


Answer 7:

对于依赖于大模块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)
}


Answer 8:

你可以把这个线在你.profile文件:

出口NODE_PATH = “$(NPM配置get前缀)/ lib目录/ node_modules”

这将使得node使用全局路径。



文章来源: NodeJS require a global module/package