ノードにグローバルモジュールをインポートするにはどうすればよいですか?「エラー:モジュール<モジュール>が見つかりません」と表示されますか?


145

Mac OSX LionでNodeをセットアップしようとしています。すべて問題なく動作しているようですが、グローバルモジュールフォルダーからモジュールをインポートできません。エラーが出ます

Error: Cannot find module <module>

これを実行すると:node -e require.paths、応答は次のようになります。

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

正しいですが、私のモジュールは確かに/ usr / local / lib / node_modulesにインストールされています。しかし、スクリプトを実行しようとすると、次のようになります。

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

私の.bash_profileは次のようになります。

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

いくつかの助けに本当に感謝します、なぜ私はどんなライブラリもインポートできないのか分かりません。


1
これは、物事を行うための好ましい方法ではないことを知っていますよね?
thejh

1
詳しく説明してもらえますか?ライブラリをグローバルフォルダーにインストールしないでください。
ハンパン

3
@ハンパン:ローカルでrequire()を使用して使用するモジュールをインストールする方法が推奨されます。
thejh

1
より良い、より更新された回答(に依存しないnpm link)はこちらにあります:stackoverflow.com/a/15646750/2671392
GGG

1
私は古い学校で、世界中の場所に図書館を設置することに慣れています。ローカルライブラリのインストールを多用することの説得力のある理由は見たことがありません。私が取っているmongodbクラスは、完了するまでに100近くの小さなプロジェクトになり、各プロジェクトには、mongodb、express、consolidateなどのライブラリの大部分が重複するセットが含まれます。インタラクティブ言語への移行により、デポジットが残る各地の図書館の数。ローカルのScalaリポジトリーには何千ものScalaライブラリーが必要です。Ditto Meteor、グルーヴィーでルビー。
Stephen W. Wright

回答:


116

npm> = 1.0を使用npm link <global-package>している場合は、を使用して、すでにグローバルにインストールされているパッケージへのローカルリンクを作成できます。(警告:OSはシンボリックリンクをサポートしている必要があります。

ただし、これには問題がないわけではありません。

npm linkは開発ツールです。ローカル開発ボックスでパッケージを管理するのに最適です。ただし、npmリンクを使用してデプロイすると、基本的に問題が発生します。これを実現することなく、非常に簡単に更新できるためです。

別の方法として、パッケージをローカルだけでなくグローバルにもインストールできます。

詳細については、


69
私はこれを読んでいて、自分の目を信じられません。それで、Expressをインストールしてから、Expressの上に20のプロジェクトを構築する場合、各プロジェクトに対して、すべてのプロジェクトフォルダーに何度もインストールする必要がありますか?私はパッケージマネージャーの経験があまりありませんが、これはちょっと
困り

25
それは正しいですし、あなたがそれについて考えれば、それは理にかなっています。依存関係をローカルで管理すると、すべてが自己完結し、プロジェクトの依存関係の特定のバージョンを指定できるようになります(たとえば、プロジェクトfooにはExpress 2.xが必要ですが、プロジェクトバーにはExpress 3ベータを使用できます)。
grahamb 2012年

43
私もしばらくの間、このロジックを理解するのに苦労しましたが、Rubyの友人がグローバルパッケージの更新に苦労しているのを見て、gemsetsについて議論し、多くの場合単にアップグレードしないだけだったので、依存関係をローカルにインストールするのが絶対に正しい方法であると認めましたパッケージ管理
timoxley

3
ソフトウェアの配布に関連するため、この状況と静的リンクライブラリと動的リンクライブラリの状況を対比させたいと思います。iOS App Storeで配布されるほとんどすべてのアプリは、iOS SDKによって提供されない依存関係を静的にリンクする必要があることを考慮してください。なぜこれが行われるのですか?グローバルな依存関係の地獄は非常に現実的なものです。
Steven Lu

1
また、npmのキャッシュ(に存在する~/.npm)を使用すると、さまざまな場所で実行される再インストールプロセスが適切になることも理解しています。
Steven Lu

85

Node.jsは環境変数NODE_PATHを使用して、モジュール検索パスに含める追加のディレクトリを指定できるようにします。コマンドを使用して、npmそれ自体を使用して、グローバルモジュールが格納されている場所を通知できますnpm root -g。したがって、これら2つをまとめると、次のコマンドを使用して、グローバルモジュールが検索パスに含まれていることを確認できます(Linux風)

export NODE_PATH=$(npm root --quiet -g)


3
NODE_PATH環境変数のヒントをありがとう。それは大いに役立ちました!
2017

7
これがトップのコメントになるはずです
Adam Prax 2017

NODE_PATHMSYS2でnpmを機能させるには、同等のposixパスに設定する必要がありました。ありがとうございました。
Joyce Babu

WindowsとGit bashでも動作します。完璧です。:-)
inf3rno 2017

これにより.node_modulesフォルダーが検索可能になりますが、を使用require()してモジュールをインポートするには、ローカルプロジェクトディレクトリにインストールする(またはを使用してリンクするnpm link)必要があります。グローバルモジュールはプロジェクトにインポートできません。そこから実行できるのはバイナリ/スクリプトのみです。
Prahlad Yeri

65

npm linkを使用して、プロジェクトフォルダー内のグローバルパッケージへのシンボリックリンクを作成できます。

例:

$ npm install -g express
$ cd [local path]/project
$ npm link express

ローカルのnode_modulesフォルダーを作成し、次にシンボリックリンクを作成するだけです-> [グローバルディレクトリ] / node_modules / expressこれは次に解決できます require('express')


このクロスOS互換性はありますか?
UpTheCreek

新しいバージョンのWindowsは、このバージョン以降、それをサポートしています:github.com/npm/npm/commit/… 古いWindowsバージョンについては、npmjs.com / package / npm
Alex

22

以下のようにパッケージをグローバルにインストールします。

$ npm install -g replace  // replace is one of the node module.

この置換モジュールはグローバルにインストールされるため、ノードモジュールフォルダーが表示されても、そこに置換モジュールは表示されず、require( 'replace')を使用してこのパッケージを使用できません。

requireを使用すると、ノードモジュールフォルダーにあるローカルモジュールのみを使用できるためです。

グローバルモジュールを使用するには、以下のコマンドを使用してグローバルモジュールをリンクする必要があります。

$ npm link replace

ここに戻って、ノードモジュールフォルダーを確認します。これで、replaceモジュールを確認でき、ローカルノードモジュールにリンクされているため、アプリケーションでrequire( 'replace')を使用できます。

さらに説明が必要かどうかをお知らせください。


14

引数としてグローバルモジュールディレクトリへのパスを指定してrequireを使用できます。

require('/path/to/global/node_modules/the_module');

私のMacでは、これを使用します。

require('/usr/local/lib/node_modules/the_module');

グローバルモジュールの場所を見つける方法は?-> npmはどこにパッケージをインストールしますか?


7

グローバル変数を指すように環境変数NODE_PATHを設定しnode_modulesます。

Windows 7以降の場合、パスは%AppData%\npm\node_modulesUNIXの場合と同様です/home/sg/.npm_global/lib/node_modules/が、ユーザーの構成によって異なります。

このコマンドnpm config get prefixは、どちらが正しいパスであるかを見つけるのに役立ちます。

UNIXシステムでは、次のコマンドで実行できます。

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Dockerを使用しています。すべてのノードの依存関係がインストールされているが、コンテナーの実行時にローカルアプリディレクトリを使用できるDockerイメージを作成しようとしています(node_modulesディレクトリまたはリンクで汚染することはありません)。これにより、このシナリオで問題が発生します。私の回避策は、モジュールの正確なパスから要求することです。たとえば、require( '/ usr / local / lib / node_modules / socket.io')


-1

require.paths 廃止予定です。

プロジェクトフォルダに移動して、次のように入力します

npm install socket.io

これにより、ノードが検索するローカルの./node_modulesフォルダーにインストールされます。

私は私のものをこのように保ちます:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

app.jsファイルを作成する

// app.js
var socket = require('socket.io')

今私のアプリを実行します

node app.js

npm >= 1.0およびを使用していることを確認してくださいnode >= 4.0


8
彼は、グローバルにインストールされたnpmパッケージの使用について質問しています。
UpTheCreek

@ジャムンド。ローカルにインストールされたパッケージの使用方法を示していますが、元の質問はグローバルパッケージに関するものでした。
Vitaliy Markitanov 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.