Я знаю, що це старе питання, але я зіткнувся з цим, намагаючись зробити перевірку версій за 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тепер для папок є більш плавна структура .
Сподіваюся, це комусь корисно.