.nvmrc を置いてもディレクトリ移動時に nvm が自動で切り替わらない
nvm は既定では `.nvmrc` を自動適用しない。
`cd` するたびに切り替えたいなら、公式 README の Deeper Shell Integration にあるシェルフックを設定ファイルへ追加する必要がある。
公開:
要約
.nvmrc を置いてもバージョンが切り替わらないのは設定ミスではなく、nvm が既定では cd をフックしないから です。.nvmrc は「nvm use を引数なしで実行したときに読まれるファイル」であって、自動適用の仕組みではありません。
まずは手動で読ませて、ファイル自体が正しいかを確かめます。
cd path/to/project
nvm use # .nvmrc(無ければ親ディレクトリを遡って探す)を読むディレクトリ移動のたびに自動で切り替えたい場合は、公式 README の Deeper Shell Integration にあるシェル別のフックを自分で設定ファイルへ入れます。
よくある原因
- 自動切り替えは標準機能ではない: nvm 本体は
chpwdやPROMPT_COMMANDを書き換えません。
自動化は利用者側でフックを足す前提の設計です。 .nvmrcの中身が壊れている: 末尾に改行以外の文字(全角スペース、vの重複、コメント)が混ざるとバージョン解決に失敗します。- そのバージョンが未インストール:
nvm useは「インストールされていない」と言って終了します。
エラーメッセージを読まずに「効かない」と判断しているケースが多いです。 - フックの置き場所が間違っている:
~/.zprofileはログインシェルでしか読まれません。
IDE の内蔵ターミナルなど非ログインシェルでは効きません。
解決策
1. まず手動で nvm use を通す
cat .nvmrc # 例: 22.11.0 / lts/* / node
nvm useFound '/path/.nvmrc' with version <...> と出れば読み込み自体は成功しています。公式ドキュメントの .nvmrc(新しいタブで開く) のとおり、ファイルはプロジェクトルートだけでなく親ディレクトリまで遡って探索されます。
2. 未インストールなら先に入れる
nvm install # 引数なしで .nvmrc のバージョンを入れて有効化する3. 自動切り替えフックを入れる(zsh の例)
~/.zshrc に以下を追記すると、cd のたびに .nvmrc を見て切り替わります。
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
nvm use
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrcbash や fish 向けの実装も Deeper Shell Integration(新しいタブで開く) に掲載されています。
自分のシェルに合ったものを使ってください。
4. ファイルの中身を検証する
cat -A .nvmrc22.11.0$ のようにバージョン文字列と改行だけになっていれば正常です。22.11.0 $ のように余分な空白が見えたら書き直します。