npmのローカルモジュールの問題をlinklocalで解決する
現在担当のプロジェクトでのお話です。
ローカルモジュールとは何ぞや?という人はnpm 2.0.0でローカルモジュールを使ってrequire('../../../')を回避する | Web Scratchをご参考に。
クライアントとサーバのモジュールを同じリポジトリに置きつつ、キレイに分割するためにnpmのローカルモジュールの機能を使おうとしています。
下記みたいなイメージ(serverだけローカルモジュールにしている)
package.json client/client.js # ビルドしてpublicに吐く、≠ローカルモジュール server.js server/package.json /lib /test public/
が、分割するにあたり、1つ問題がでてきました。
ローカルモジュール内のファイルを変更した場合、手動で再インストールしないと、反映されないのです。 (変更の度にファイルをnode_modulesにコピーしないといけない)
解決策1
最初に考えた正統派な方法はこれです(local-serverがローカルモジュールと考えてください)
npm version patch && npm update local-server
が、めんどいので却下。
解決策2
次に考えた方法はこれ。
npm install --force local-server
が、遅いので、ちょっと開発には厳しい。。
解決策3(これに決定)
仕方なく、../../../
問題で有名なgist Better local require() paths for Node.js · GitHub
の議論を追っていたところ、
というモジュールの存在を知りました。
要はローカルモジュールをnode_modulesにコピーするのではなく、シンボリックリンクを自動的に貼ってくれるというもの。
package.jsonに
"scripts": { "linklocal": "rm -rf ./node_modules/local-* && linklocal" }
みたいなタスクを定義して、いい感じに扱えるようになりました。