Sé que esta es una vieja pregunta, pero me encontré con esto cuando intentaba hacer una verificación de versión usando semver
un preinstall
script package.json
. Como sabía que no podía depender de ningún módulo local instalado, utilicé esto para solicitarlo semver
desde la node_modules
carpeta global (ya que npm
depende 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_PATH
solució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 install
mi 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 dependencies
aquí: 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_modules
carpetas.
Espero que sea útil para alguien.