Voltaでも.node-versionや.nvmrcを使ってNode.jsのバージョン切り替えがしたい!

2023/08/29に公開

はじめに

ディレクトリ移動をするとNode.jsのバージョンを自動で切り替えてくれるバージョンマネージャーの存在って嬉しいですよね。

私はRust製のVoltaを使っているのですが……

「Voltaでも.node-version.nvmrcを使ってNode.jsのバージョン切り替えがしたい!」

「でもチームメンバーはVoltaを使っていないのでpackage.jsonを汚染するのはいやだ!」

そう思ったことはありませんか?

https://github.com/volta-cli/volta/issues/282

https://github.com/volta-cli/volta/issues/983

しかし、以前からIssueに上がっている通り、残念ながらVoltaでは.node-versionを使ったバージョン切り替えに対応していません。

対応していないなら自分で対応してしまえ!!👊

ということで、chpwdを使って.node-version.nvmrcがあれば、VoltaでもNode.jsのバージョンが切り替わるようにしてみました。

chpwdを使って.node-versionや.nvmrcを読み込む

できあがったコードは以下の通りです。自身の.zshrcに追記してみてください。

ディレクトリ移動をフックして処理を実行するzshのchpwdを利用し、.node-version.nvmrcの設定値に応じて、volta installの実行の仕方を調整しています。

.zshrc
autoload -Uz add-zsh-hook
function chpwd_volta_install() {
  # .node-versionが存在するかチェック
  if [[ -e ".node-version" ]]; then
    # .node-versionから内容を読み取る
    content=$(cat .node-version)
    volta install node@$content --quiet
  fi

  # .nvmrcが存在するかチェック
  if [[ -e ".nvmrc" ]]; then
    # .nvmrcから内容を読み取る
    content=$(cat .nvmrc)

    case $content in
    # lts/argonの場合
    "lts/argon")
      volta install node@4 --quiet
      ;;
    # lts/boronの場合
    "lts/boron")
      volta install node@6 --quiet
      ;;
    # lts/carbonの場合
    "lts/carbon")
      volta install node@8 --quiet
      ;;
    # lts/dubniumの場合
    "lts/dubnium")
      volta install node@10 --quiet
      ;;
    # lts/erbiumの場合
    "lts/erbium")
      volta install node@12 --quiet
      ;;
    # lts/fermiumの場合
    "lts/fermium")
      volta install node@14 --quiet
      ;;
    # lts/galliumの場合
    "lts/gallium")
      volta install node@16 --quiet
      ;;
    # lts/hydrogenの場合
    "lts/hydrogen")
      volta install node@18 --quiet
      ;;
    # lts/*の場合
    "lts/*")
      volta install node@lts --quiet
      ;;
    # latest,current,node,*の場合
    "latest" | "current" | "node" | "*")
      volta install node@latest --quiet
      ;;
    # それ以外の場合
    *)
      volta install node@$content --quiet
      ;;
    esac
  fi
}
add-zsh-hook chpwd chpwd_volta_install

.node-versionは良いのですが、.nvmrcはセマンティックバージョン以外にもLTSコードネームによる指定方法があったりしたので、意外と厄介でしたね……

他にも条件がありそうな気もしますが、しばらくこれで運用してみようと思っています。

ramenディレクトリとsushiディレクトリとtempuraディレクトリを移動しているところ

.node-version.nvmrcpackage.jsonがあるディレクトリ間を実際に移動みるとこんな感じ。

バッチリっすね👍

参考

下記の記事を参考にさせていただきました!ありがとうございました!

https://github.com/actions/setup-node

https://github.com/shadowspawn/node-version-usage

https://github.com/nvm-sh/nvm/blob/master/nvm.sh

https://zsh.sourceforge.io/Doc/Release/Functions.html

https://nodejs.org/ja/download/releases

株式会社HRBrain

Discussion