プログラミング

node.jsのrequireで参照されるライブラリのパスを取得

例えばカレントディレクトリのnodeプログラムがどこのnodeパッケージを参照するのか、それはカレントディレクトリのnode_modulesであるべきだが、node pathに指定されたデフォルトのnode_modulesを参照しているケースもある。そのような場合、カレントディレクトリのリポジトリをgithubなどにポストしても、任意の環境にcloneされた実行環境ではパッケージのnot foundエラーとなることとなる。

e.g. カレントディレクトリは /mnt/c/pg/ でpackages.jsonは定義されていないが、デフォルトのnode_pathの /mnt/c/pg/node/ がされる例

/mnt/c/pg$ node
> require.resolve('express')
'/mnt/c/pg/node/node_modules/express/index.js'

e.g. expressやexpressはカレントディレクトリのnode_modulesを参照できているが、corsに関しては見つからないためデフォルトが参照される例

/mnt/c/pg/web/vue_dev$ node
> require.resolve('cors')
'/mnt/c/pg/node/node_modules/cors/lib/index.js'
> require.resolve('express')
'/mnt/c/pg/web/vue_dev/node_modules/express/index.js'
> require.resolve('express')
'/mnt/c/pg/web/vue_dev/node_modules/moment/moment.js'

さらに、パッケージがカレントディレクトリのローカルにインストールされている場合でも、依存関係としてインストールされておりそれが使用されている状況なのか、きちんとpackages.jsonにバージョン指定でインストールされ使用ているのか、でも後に問題を引き起こしかねない

例えばpackages.jsonにexpressが定義されていないがローカルの./node_modules/express/index.jsが参照できている場合、他の何らかのパッケージの依存関係としてインストールされた任意のバージョンのexpressが使用されていることになる。

npm list -g | less
npm list | less

npm listなどで依存関係ツリーのどこにそれが位置しているか、バージョンは何か、トップレベルで使用されているパッケージはすべてpackages.jsonに指定されているか、を確認することが重要と言える。

(参考)

In node.JS how can I get the path of a module I have loaded via require that is not mine (i.e. in some node_module) – Stack Overflow

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です