JavaScript
Node
npm

npm link を使い、複数の JavaScript モジュールを並行で開発する

More than 1 year has passed since last update.

JavaScirpt を使ったアプリケーションの開発において、
依存関係のある復数のモジュールを並行で開発する状況はよくあると思います。
そのような状況の手助けをしてくれるコマンドが npm link です。

モジュール(A, B)を並行開発中に、B が A を必要としている状況があるとします。

A を少し変更するたびに npm publish したり、A のコードを B/node_modules/A 以下にコピーするのは辛いので npm link でリンクを作成し解決します。

まずは、A のディレクトリに移動し npm link を実行します。

cat package.json | jq '{name}'    # Aのモジュール名を確認(この例では"A")
> { "name": "A" }

npm link
> /usr/local/lib/node_modules/A -> ~/workspace/A

これにより ~/workspace/A/usr/local/lib/node_modules/A にリンクされます。

次に、B のディレクトリに移動し npm link A を実行します。

npm link A
> ~/workspace/B/node_modules/A -> /usr/local/lib/node_modules/A

これで ~/workspace/A~/workspace/B/node_modules/A にリンクされます。

これで A と B を並行で開発できます。

コマンドパス

また、 ~/workspace/A/package.json に { "bin": "./cli.js" } といった記述(コマンドラインツールのパス等)がある場合は、こちらも一緒にリンクが作成されます。

~/workspace/A/cli.js~/workspace/B/node_modules/.bin/cli.js にリンクされます。

また 環境変数 PATH に ./node_modules/.bin を追加しておくと、./node_modules/.bin/cli とすべきところを cli xxx で直接呼び出す事が可能になります(グローバルインストールされているかのように振る舞わせる事が可能になります)。

export PATH="./node_modules/.bin:$PATH"

PATH の追加設定は npm link の使用に限らず、常に設定しておくと幸せになれます。