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