Wiem, że to stare pytanie, ale natknąłem się na to, próbując sprawdzić niektóre wersje za semver
pomocą preinstall
skryptu w programie package.json
. Ponieważ wiedziałem, że nie mogę polegać na żadnych zainstalowanych modułach lokalnych, użyłem tego, aby wymagać semver
z node_modules
folderu globalnego (w npm
zależności od tego wiem, że tam jest):
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);
}
Podoba mi się to podejście, ponieważ nie wymaga instalacji żadnych specjalnych modułów w celu użycia.
Nie poszedłem z NODE_PATH
rozwiązaniem, które sugerowali inni, ponieważ chciałem, aby to działało na czyimś komputerze, bez konieczności dodatkowej konfiguracji / ustawień przed uruchomieniem npm install
dla mojego projektu.
Sposób, w jaki jest to zakodowane, gwarantuje znalezienie tylko modułów najwyższego poziomu (zainstalowanych przy użyciu npm install -g ...
) lub modułów wymaganych przez npm
(wymienione dependencies
tutaj: https://github.com/npm/npm/blob/master/package.json ). Jeśli używasz nowszej wersji NPM, może ona znaleźć zależności innych pakietów zainstalowanych globalnie, ponieważ teraz istnieje bardziej płaska struktura node_modules
folderów.
Mam nadzieję, że to komuś się przyda.