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
の使用に限らず、常に設定しておくと幸せになれます。