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