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 を消します。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark