asdfを使ってNode.jsのバージョンを管理している環境で npm を使ってグローバルにコマンドラインツールをインストール後、いざ使おうとすると command not found エラーが出て、解決した話をご紹介します。
背景: npm install --global (npm install -g) したのにコマンドが見つからない
例えば、AnthropicのClaudeコマンドラインツールをインストールするために、以下のコマンドを実行しました。
npm install -g @anthropic-ai/claude-codeインストールは正常に完了したように見えます。しかし、実際にclaudeコマンドを実行してみると、
claude
zsh: command not found: claudeこのようにシェルがコマンドを見つけられず、エラーになってしまいます。
原因: asdf の shim が更新されていない
asdf環境で npm install -g を実行した後に command not found と表示される場合、その原因はasdfがコマンドを管理する仕組みにあります。
asdfは、インストールされた各言語の実行ファイルへのパスを直接通すのではなく、shimと呼ばれるラッパースクリプトを介してコマンドを実行します。これにより、プロジェクトごとに適切なバージョンのコマンドを自動で切り替えることを可能にしています。
npm install -g で新しいコマンド(今回の例では claude )をインストールしても、asdfは自動でその存在を認識しません。そのため、asdfが管理しているshimのリストに新しいコマンドが追加されず、結果としてパスが通っていない状態になってしまうのです。
解決方法: asdf reshim を実行する
結論として、asdf reshim を実行することで解決します。
reshim は、asdfに対して、インストール済みのパッケージを再スキャンし、shimを再生成するように指示するコマンドです。
今回のケースでは、Node.jsのパッケージをインストールしたので、以下のコマンドを実行します。
asdf reshim nodejsこのコマンドを実行することで、asdfは新しくインストールされた claude コマンドを認識し、適切なシムを作成してくれます。
コマンド実行後、再度 claude コマンドを試してみてください。今度は正常に実行されるはずです。
まとめ
asdf環境でグローバルにパッケージをインストール後は、対応する言語のasdf reshimを実行する習慣をつけると、このような command not found エラーを未然に防ぐことができます。
- 問題:
npm install -g後にコマンドが見つからない。 - 原因: asdfのシムが更新されていない。
- 解決策:
asdf reshim <target>を実行する。(例:asdf reshim nodejs)
もし同様の現象に遭遇したらぜひ試してみてください。
以上、asdf環境で command not found エラーが発生したら asdf reshim していきたい、現場からお送りしました。