我正在寻找一种通用方法来获取Node.js中已安装的npm包的(绝对)根路径.
我知道require.resolve,但这将给我一个入口点(主模块的路径)而不是包的根路径.
以bootstrap-sass作为一个例子.假设它在本地安装在项目文件夹中C:\dev\my-project.然后我正在寻找的是C:\dev\my-project\node_modules\bootstrap-sass.require.resolve('bootstrap-sass')会回来的C:\dev\my-project\node_modules\bootstrap-sass\assets\javascripts\bootstrap.js.
我可以想到几种方法如何获取包的根路径:
var packageRoot = path.resolve('node_modules/bootstrap-sass');
console.log(packageRoot);
Run Code Online (Sandbox Code Playgroud)
这适用于本地安装在node_modules文件夹中的软件包.但是,如果我在子文件夹中,我需要解决../node_modules/bootstrap-sass,并且使用更多嵌套文件夹会变得更复杂.此外,这不适用于全局安装的模块.
var packageRoot = require.resolve('bootstrap-sass')
.match(/^.*[\/\\]node_modules[\/\\][^\/\\]*/)[0];
console.log(packageRoot);
Run Code Online (Sandbox Code Playgroud)
这适用于安装在node_modules文件夹中的本地和全局模块.正则表达式将匹配最后一个node_modules路径元素以及以下路径元素的所有内容.但是,如果将包的入口点设置为另一个包(例如,"main": "./node_modules/sub-package"in package.json),则会失败.
var escapeStringRegexp = require('escape-string-regexp');
/**
* Get the root path of a npm package installed in node_modules.
* @param {string} packageName The name of the package.
* @returns {string} Root path of the …Run Code Online (Sandbox Code Playgroud)