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