Я знаю , что это старый вопрос, но я столкнулся с этим , когда пытаюсь сделать некоторые проверки версий , используя 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папок.
Надеюсь, это кому-нибудь пригодится.