如何以编程方式获取npm安装全局模块的位置

7
3个回答

4
NPM的主要工作是“将东西放在您的计算机上。” 他们的文件夹文档详细说明了它将东西放在哪里。
由于操作系统之间的差异,.npmrc配置和prefix属性,最好依靠npm来确定全局安装目录,方法是使用npm root
$ npm root -g

您可以像这样使用Node.js执行命令行二进制文件:execute a command line binary with Node.js
const { exec } = require('child_process')
const { promisify } = require('util');

async function main() {
    let execAsync = promisify(exec);
    let { stdout: globalPath } = await execAsync("npm root -g");
    console.log(globalPath);
}

或者,为了以编程方式访问npm模块,您需要在本地安装它:

$ npm i npm --save

然后您可以运行以下代码:
const npm = require("npm")
const { promisify } = require('util');

async function main() {
    await promisify(npm.load)()
    let globalPath = npm.root
    console.log(globalPath)
}

更多阅读


3

来自nodejs网站:

全局 - 这将在{prefix}/lib/node_modules中删除模块,并将可执行文件放入{prefix}/bin中,其中{prefix}通常类似于/usr/local。如果提供,它还会在{prefix}/share/man中安装手册页。

要获取前缀,请输入:

npm config get prefix

编辑:

如果要从Node中执行此操作,请使用npm npm模块。以下代码可以正常工作:

var npm = require("npm")
var myConfigObject = {}
npm.load(myConfigObject, function (er) {
    if (er) return handleError(er)
    console.log(npm.get('prefix'));
})

谢谢您!现在如果我能弄清楚如何加载全局npm模块,这样我就可以从JavaScript中获取正确的前缀,而不是通过命令执行了。 - B T
实际上,我的文件在<prefix>/node_modules中 - 对我来说没有lib或bin文件夹。我使用的是Windows系统。 - B T
有一个针对npm的npm模块。也许这可以帮助你。 - Doug Amos
尝试过了。不幸的是,A)你在上面写的版本行不通(应该是npm.prefix),B)它返回的前缀是本地模块安装的前缀,而不是全局安装的前缀。 - B T
1
另外需要注意的是,Windows和Linux上的操作略有不同。在Windows上,全局模块安装在<prefix>/node_modules中,而在Linux上则安装在<prefix>/lib/node_modules中。 - B T
1
module.paths.push(<prefix>/node_modules) - airportyh

1
如果您不想依赖npm:
const { resolve } = require('path')    
const globalPath = resolve(process.execPath, '../../lib/node_modules')

当"prefix"属性被设置时,这不起作用,使全局node_modules存在于其他位置。 - Yaniv Kessler
不要认为这适用于Windows上的全局npm安装位置。 - KyleMit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接