nvm use の自動実行

はじめに

kossyです。nodeのバージョンをGlobalに変えたくない(そもそもDocker使え!!)時、ありませんか?

今回は、.nvmrcを用意し、ディレクトリを切り替えた時に自動で .nvmrcで指定したバージョンに切り替える方法を解説します。

環境

MacBookPro Intel Core i5 nvm 0.34.0

結論

~/.bash_profile に以下のコードを追加

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

そして ~/.bashrcに以下のコードを追加します。

cd_nvm_use() {
  local nvmrc_path=".nvmrc"

  if [[ -f "$nvmrc_path" && -r "$nvmrc_path" ]]; then
    local nvmrc_node_version=$(cat "$nvmrc_path")
    local current_node_version=$(node -v | sed 's/^v//')

    if [[ "$nvmrc_node_version" != "$current_node_version" ]]; then
      nvm use || echo "Error: nvm use failed"
    fi
  fi
}

export PROMPT_COMMAND="cd_nvm_use; $PROMPT_COMMAND"

解説

.bash_profile

// if ステートメントは条件式が真(true)の場合に、後に続くコマンドを実行
if [ -f ~/.bashrc ]; then
  . ~/.bashrc // . (ドット) コマンドは別名 source コマンドであり、指定されたファイルの内容を現在のシェルコンテキストで実行する。この場合、.bashrc ファイルが存在する場合、その内容が現在のシェルセッションに読み込まれ、実行される。
fi

この設定は、ログインシェルおよび非ログインシェルの間で設定を共有するのが目的です。

このコードにより、ログイン時にもこれらのカスタマイズが適用されるようになります。

.bashrc

cd_nvm_use() {
  local nvmrc_path=".nvmrc"

  if [[ -f "$nvmrc_path" && -r "$nvmrc_path" ]]; then
    local nvmrc_node_version=$(cat "$nvmrc_path")
    local current_node_version=$(node -v | sed 's/^v//')

    if [[ "$nvmrc_node_version" != "$current_node_version" ]]; then
      nvm use || echo "Error: nvm use failed"
    fi
  fi
}

export PROMPT_COMMAND="cd_nvm_use; $PROMPT_COMMAND"

ディレクトリを移動するたびに、そのディレクトリ内に .nvmrc ファイルが存在するかどうかを確認し、

存在する場合はそのファイルに指定された Node.js のバージョンを使うように nvm use コマンドを実行するようにしています。

あとがき

横着して bash スクリプトにしましたが、おとなしく docker で環境構築をした方がいいと思います。。。