これは古い質問であることはわかっていますが、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
フォルダーの構造がよりフラットになるため、グローバルにインストールされた他のパッケージの依存関係が見つかる可能性があります。
これが誰かに役立つことを願っています。