我知道这是一个老问题,但是当我尝试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
列出: https ://github.com/npm/npm/blob/master/package.json )。如果您使用的是较新版本的 NPM,它可能会找到其他全局安装包的依赖项,因为现在文件夹结构更加扁平。dependencies
node_modules
希望这对某人有用。