Sé que esta es una vieja pregunta, pero me encontré con esto cuando intentaba hacer una verificación de versión usando semverun preinstallscript package.json. Como sabía que no podía depender de ningún módulo local instalado, utilicé esto para solicitarlo semverdesde la node_modulescarpeta global (ya que npmdepende de él, sé que está allí):
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);
}
Me gusta este enfoque porque no requiere la instalación de ningún módulo especial para poder usarlo.
No elegí una NODE_PATHsolución como han sugerido otros, ya que quería que esto funcione en la máquina de cualquier persona, sin tener que requerir una configuración / configuración adicional antes de ejecutar npm installmi proyecto.
De la forma en que esto está codificado, solo está garantizado encontrar módulos de nivel superior (instalados usando npm install -g ...) o módulos requeridos por npm(enumerados dependenciesaquí: https://github.com/npm/npm/blob/master/package.json ). Si está utilizando una versión más nueva de NPM, puede encontrar dependencias de otros paquetes instalados globalmente, ya que ahora hay una estructura más plana para las node_modulescarpetas.
Espero que sea útil para alguien.