- Published on
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- Authors
- Name
- Shou Arisaka / 有坂 翔
- 情報技術者 / Z世代プログラマー / 米大学院にてデータサイエンスを学ぶ
- ITプロフェッショナルとして活動しています。React.js等のモダンなウェブ制作・アプリ開発を得意としており、Java・Python・Rust等のプログラミング言語を用いたソフトウェア開発全般を行っています。
- Github 🐙StackOverflow 🔥Qiita 📝
- TechFreeTools 🔧About.me 👤