できない.dev

.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 にあるシェル別のフックを自分で設定ファイルへ入れます。

よくある原因

  1. 自動切り替えは標準機能ではない: nvm 本体は chpwdPROMPT_COMMAND を書き換えません。
    自動化は利用者側でフックを足す前提の設計です。
  2. .nvmrc の中身が壊れている: 末尾に改行以外の文字(全角スペース、v の重複、コメント)が混ざるとバージョン解決に失敗します。
  3. そのバージョンが未インストール: nvm use は「インストールされていない」と言って終了します。
    エラーメッセージを読まずに「効かない」と判断しているケースが多いです。
  4. フックの置き場所が間違っている: ~/.zprofile はログインシェルでしか読まれません。
    IDE の内蔵ターミナルなど非ログインシェルでは効きません。

解決策

1. まず手動で nvm use を通す

cat .nvmrc          # 例: 22.11.0 / lts/* / node
nvm use

Found '/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-nvmrc

bash や fish 向けの実装も Deeper Shell Integration(新しいタブで開く) に掲載されています。
自分のシェルに合ったものを使ってください。

4. ファイルの中身を検証する

cat -A .nvmrc

22.11.0$ のようにバージョン文字列と改行だけになっていれば正常です。22.11.0 $ のように余分な空白が見えたら書き直します。

この記事は役立ちましたか?