Eu sei que essa é uma pergunta antiga, mas me deparei com isso ao tentar fazer uma verificação de versão usando semver
um preinstall
script no package.json
. Como sabia que não podia depender de nenhum módulo local instalado, usei isso para exigir semver
da node_modules
pasta global (pois npm
depende disso, sei que está lá):
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);
}
Eu gosto dessa abordagem porque isso não requer a instalação de nenhum módulo especial para ser usado.
Não escolhi uma NODE_PATH
solução como outras pessoas sugeriram, pois queria que isso funcionasse na máquina de qualquer pessoa, sem precisar exigir configuração adicional antes de executarnpm install
meu projeto.
Da maneira como isso é codificado, é garantido encontrar apenas os módulos de nível superior (instalados usando npm install -g ...
) ou os módulos exigidos por npm
(listados dependencies
aqui: https://github.com/npm/npm/blob/master/package.json ). Se você estiver usando uma versão mais recente do NPM, ele poderá encontrar dependências de outros pacotes instalados globalmente, pois há uma estrutura mais plana paranode_modules
pastas.
Espero que isso seja útil para alguém.