199

私はグローバルにインストールしてから、次のように使用しようとしてforeverforever-monitorます。

npm install -g forever forever-monitor

通常の出力と、ファイルをグローバルパスにコピーする操作が表示されますが、実行しようとするrequire("forever");と、モジュールが見つからなかったというエラーが表示されます。

私はノードとnpmの両方の最新バージョンを使用しており、npmがグローバルインストールとローカルインストールで行った変更についてはすでに知っていますが、すべてのプロジェクトにローカルをインストールしたくないので、そうでないプラットフォームで作業していますグローバルインストール後はサポートされlinkないので、私にはできません。npm link

私の質問は、グローバルにインストールされたパッケージを要求できないのはなぜですか?それは機能ですか、それともバグですか?それとも私は何か間違ったことをしていますか?

PS:明確にするために、ローカルにインストールしたくありません。

4

9 に答える 9

256

Node.jsでは、requireはグローバルモジュールがインストールされているフォルダーを検索しません。

これは、NODE_PATH環境変数を設定することで修正できます。Linuxでは、これは次のようになります。

export NODE_PATH=/usr/lib/node_modules

注:これは、グローバルモジュールが実際にインストールされている場所によって異なります。

参照:グローバルフォルダからの読み込み

于 2013-03-26T20:28:19.417 に答える
115

パッケージをグローバルにインストールした後、ローカルプロジェクトをグローバルパッケージにリンクする必要があります

npm install express -g
cd ~/mynodeproject/
npm link express  

こちらをご覧ください

于 2013-03-26T14:04:44.473 に答える
34

ネクロマンシーについてお詫びしますが、グローバルにインストールされたモジュールへのハードコードされたパスを指定できます。

var pg = require("/usr/local/lib/node_modules/pg");

これは完璧ではありませんが、Unity3dがプロジェクトディレクトリに含まれているすべてのJavaScriptを「コンパイル」しようとしていることを考えると、実際にはパッケージをインストールできません。

于 2014-03-07T22:45:20.077 に答える
23

ドキュメントによると、Node.jsはデフォルトで次の場所を検索します。

  1. NODE_PATH環境変数で指定されたパス

    注:NODE_PATH環境変数は、コロンで区切られた絶対パスのリストに設定されます。

  2. 現在のnode_modulesフォルダ。(ローカル)

  3. $HOME/.node_modules(グローバル)

    注:$HOMEはユーザーのホームディレクトリです。

  4. $HOME/.node_libraries(グローバル)
  5. $PREFIX/lib/node(グローバル)

    注:$PREFIXはNode.jsで構成されていますnode_prefix

    の現在の値を確認するには、次のコマンドをnode_prefix実行します。

    node -p process.config.variables.node_prefix
    

    注:プレフィックスは--prefixビルド中のparamに対応し、に相対的process.execPathです。コマンドの値と混同しないでくださいnpm config get prefixソース

指定されたモジュールが見つからない場合は、上記のいずれかの場所に存在しないことを意味します。

モジュールがインストールされているグローバルルートフォルダの場所は、次の方法で出力できますnpm root -g(デフォルトでは、npmrcファイルでオーバーライドされない限り、パスは実行時に計算されます)。

解決

次の回避策を試すことができます。

  • NODE_PATH環境変数でグローバルモジュールの場所を指定します。例えば

    echo 'require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node
    

    の値をテストして印刷するには、次のコマンドをNODE_PATH実行します。

    echo 'console.log(process.env.NODE_PATH); require("forever")' | NODE_PATH="$(npm root -g):$NODE_PATH" node 
    
  • $HOME/.node_modulesより永続的な解決策として、次のコマンドを実行して、グローバルユーザーフォルダーをルートフォルダーを指すようにリンクします。

    ln -vs "$(npm root -g)" "$HOME"/.node_modules
    

    次に、コマンドを使用して再テストしecho 'require("forever")' | nodeます。

  • スクリプトを呼び出す前に、現在のフォルダを拡張機能がグローバルにインストールされている場所に一時的に変更します。例えば

    npm install -g forever
    cd "$(npm root -g)"
    echo 'require("forever")' | node
    cd -
    
  • npmuserconfigファイル( :)npm help 5 npmrcまたはuserconfigparam( )でグローバルインストール先を構成します--prefix

    現在の構成を表示するには、次のコマンドを実行しますnpm config list

    現在の構成を編集するには、次のコマンドを実行しますnpm config edit

  • を呼び出すときに、ノードモジュールの場所のフルパスを指定しますrequire()。例えば

    require("/path/to/sub/module")
    
  • パッケージをカスタムの場所にインストールします。例:

    npm install forever -g --prefix "$HOME"/.node_modules
    

    ただし、インストールはの下~/.node_modules/lib/node_modules/にあるため、場所を追加する必要があります。

    参照:カスタムロケーションへのnpmローカルインストールパッケージ

  • グローバルパッケージの場所から現在のフォルダにシンボリックリンクを作成します。例えば

    npm link forever
    
于 2018-01-07T18:48:18.543 に答える
20

これは古い質問ですが、のスクリプトで使用semverしてバージョンチェックを実行しようとしたときに、これに遭遇しました。インストールされているローカルモジュールに依存できないことを知っていたので、これを使用してグローバルフォルダーから要求しました(依存するため、そこにあることがわかります)。preinstallpackage.jsonsemvernode_modulesnpm

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

これが誰かに役立つことを願っています。

于 2016-07-22T20:58:14.080 に答える
15

このパッケージrequiregを使用して、この問題を解決できます。

var forever = require('requireg')('forever')

トリックを行います。

また、別のモジュールがあります。これglobal-npmは、グローバルの使用に固有のものnpmですが、短いコードを見て、テクニックがどのように機能するかを確認できます。

于 2016-01-14T14:52:49.590 に答える
10

のような大きなモジュールに依存するCLIユーティリティの場合puppeteer、を生成し、npm root -gそれを使用してグローバルモジュールを要求するのが好きです。

try {
  const root = require('child_process').execSync('npm root -g').toString().trim()
  var puppeteer = require(root + '/puppeteer')
} catch (err) {
  console.error(`Install puppeteer globally first with: npm install -g puppeteer`)
  process.exit(1)
}
于 2018-12-20T06:07:01.097 に答える
5

この行を.profileファイルに入れることができます:

export NODE_PATH = "$(npm config get prefix)/ lib / node_modules"

これによりnode、グローバルパスが使用されます。

于 2018-02-11T14:37:36.580 に答える
0

私は他の答えに従ってみましたが、私のために働いたのは

      node_path = "C:\\Users\\{usename}\\AppData\\Roaming\\npm\\node_modules"
      const *modulename* = require(node_path + "\\" +'*modulename*');

于 2020-12-25T23:13:56.837 に答える