anyenv / nodenv 環境でグローバルパッケージを入れたら rehash を忘れずに
macOS で anyenv を経由して nodenv を使っている開発者にとって、「npm install -g でいれたコマンドが見つからない・・・」というトラブルはよく起きがちです。 備忘録として、rehash の […]
目次
macOS で anyenv を経由して nodenv を使っている開発者にとって、「npm install -g でいれたコマンドが見つからない・・・」というトラブルはよく起きがちです。
備忘録として、rehash の必要性と、今回遭遇した「rehash 自体が失敗する」「依存パッケージが足りない」という2つ解決策をメモしておきます。
1. なぜ rehash が必要なのか
nodenv は、実体のバイナリ(/versions/x.x.x/bin/...)を直接実行するのではなく、shims(シム) という実行用のリンクを介してコマンドを呼び出します。
グローバルパッケージを新しくインストールしても、この shims ディレクトリ内に新しいコマンドのリンクが生成されない限り、シェルは「そんなコマンドはない(command not found)」と返してきます。これを再構築するのが rehash です。
# グローバルインストール後
nodenv rehash
2. rehash 自体がエラーになる場合
稀に、nodenv rehash を実行しても以下のようなエラーで拒否されることがあります。
nodenv: cannot rehash: /Users/username/.anyenv/envs/nodenv/shims/.nodenv-shim exists
これは、前回の rehash 処理が途中でクラッシュしたり中断された際に、ロックファイル(.nodenv-shim)が残ってしまった状態です。この場合は、手動でそのファイルを削除してから再度 rehash する必要があります。
rm $(nodenv root)/shims/.nodenv-shim
nodenv rehash
まとめ
anyenv / nodenv 環境で npm i -g したた場合、忘れないように nodenv rehash を実行しましょう。もし rehash がエラーなら、shims/.nodenv-shim を消します。