📝

anyenv+nodenvでプロジェクトのNode.jsのバージョンを自動で切り替える

2023/11/19に公開

はじめに

年末に近づくにつれて、ローカル環境も来年に向けて新しくしたくなる

地味に面倒に思っていたのが、プロジェクトごとに Node.js のバージョンを切り替えることだった
仕事でも Node.js を 20 系に上げるタスクをしたときに、18 と 20 を行き来しながら動作確認をしてて簡単にできると良いなと思った

そこで、今回は anyenvnodenv をベースにプロジェクトの package.jsonengines オプションを参照して Node.js のバージョンを自動的に切り替えるように設定する方法を書いていく

Homebrew がインストールされている前提で大まかあ流れとしては以下になる

  • anyenv の導入と設定
  • nodenv の導入と設定
  • nodenv-package-json-engine の導入と設定

(もしも)nodebrew で Node.js のバージョンを管理していた場合

すでに nodebrew を使っている場合は、シェルの設定でパスを外しておいてから試す
自分の場合は普段から使っていたため、以下のように外した

# 設定ファイル
vi ~/.zshrc

# 以下のようにパスをコメントアウトする
# PATH=$HOME/.nodebrew/current/bin:$PATH

anyenv の導入と設定

https://github.com/anyenv/anyenv

公式の紹介通りに入力すれば一通り導入はできる

# homebrew経由でインストールする
brew install anyenv

# anyenvを初期化する
anyenv init

# 以下の案内が出るのでシェルの設定に記載する
# Load anyenv automatically by adding
# the following to ~/.zshrc:

echo 'eval "$(anyenv init -)"' >> ~/.zshrc

# ターミナルをリロードするとマニフェストディレクトリがないと案内される
exec $SHELL -l

# ANYENV_DEFINITION_ROOT(/Users/whoami/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
# > anyenv install --init

# マニュフェストディレクトリを作る
anyenv install --init

# インストールするディレクトリのパスを確認して続ける
# Manifest directory doesn't exist: /Users/username/.config/anyenv/anyenv-install
# Do you want to checkout ? [y/N]: y
# 以下、インストール内容なので省略

# ターミナルを再起動して問題がないことを確認する
exec $SHELL -l

上記の手順を踏んでも CommandLineTools がインストールされていなければ、以下のような案内が出る

Cloning https://github.com/anyenv/anyenv-install.git master to /Users/xxxxxx/.config/anyenv/anyenv-install...
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

その場合は CommandLineTools をインストールしてから、再度マニフェストディレクトリを作る

nodenv の導入と設定

anyenv から nodenv をインストールする

# nodenvをインストールする
anyenv install nodenv

# インストールが終わったら、ターミナルを再起動する
exec $SHELL -l

# envコマンドでanyenvやnodenvのパスやルート情報が確認できる
env

# PATH=/Users/username/.anyenv/envs/nodenv/shims:/Users/username/.anyenv/envs/nodenv/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/sbin:/Users/username/.nodebrew/current/bin
# NODENV_ROOT=/Users/username/.anyenv/envs/nodenv
# NODENV_SHELL=zsh

nodenv で Node.js をインストール

https://github.com/nodenv/nodenv#installing-node-versions

nodenv でインストールできるバージョン一覧を確認する

nodenv install -l

anyenv の拡張機能を追加する

ただ、バージョン確認をしても最新のバージョンが表示されないときがある
そのため、以下のプラグインをインストールすると使いたい最新の Node.js のバージョン一覧を anyenv からアップデートすることができる

https://github.com/anyenv/anyenv#plugins

https://github.com/znz/anyenv-update

mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

インストールが終わったら、 anyenv で管理する各種言語のバージョン一覧をアップデートすることができる

anyenv install

nodenv の基本的な操作

各種基本的な操作は以下のようにできる

説明 操作
インストール(バージョン指定) nodenv install バージョン
アンインストール(バージョン指定) ~/.anyenv/envs/nodenv/versions/バージョン を削除
インストール済みバージョンの一覧 nodenv whence npm
デフォルトの Node.js バージョンを指定 nodenv global バージョン
プロジェクトの Node.js バージョンを指定 プロジェクトのディレクトリで
nodenv local バージョン

nodenv のバージョン自動切り替えの導入と設定

上記の設定でもプロジェクト内のバージョン指定をしたファイルがあれば、Node.js のバージョンは切り替えられる
ただ、 package.jsonengines で指定したバージョンを切り替えの対象にするためには以下のプラグインをインストールする必要がある

https://github.com/nodenv/nodenv-package-json-engine

インストールは以下のコマンドになる

git clone https://github.com/nodenv/nodenv-package-json-engine.git $(nodenv root)/plugins/nodenv-package-json-engine

これで package.jsonengines を参照して Node.js のバージョンを自動で切り替えられるようになる

さいごに

これでプロジェクトごとに Node.js のバージョンを毎回変えながら開発する必要がなくなってすごく便利になった
anyenvnodenv のプラグインが見つかったら、今後試してみたいと思っている

Discussion