Alfa Brain

Автоматическое переключение версий NodeJS (nvm use)

Алексей ВечкановАлексей Вечканов   

У меня на рабочем PC множество проектов, как рабочих, так и личных. Во многих из них используется разная версия NodeJS. И как же бесит эта надпись: The engine "node" is incompatible with this module. Если в директории проекта есть файл .nvmrc то можно переключить версию NodeJS при помощи NVM (Node Version Manager) командой nvm use. Но делать это каждый раз вручную - дело неблагодарное. Посему, предлагаю автоматизировать.

Изображение статьи

MacOS и Linux

Собственное решение

Если вы работаете за MacOS, добавьте скрипт ниже в самый конец файла .zshrc в домашней директории (~/.zshrc). Если вы используете Linux, или вы используете подсистему Linux в Windows (WSL) то данный скрипт нужно добавить в файл .bashrc по тому же пути.

########################
# Автоматическое nvm use
########################

# Определяет переменную окружения NVM_DIR, которая указывает на директорию, где установлен nvm. 
export NVM_DIR="$HOME/.nvm"
# Проверяет, существует ли скрипт nvm.sh в указанной директории и не является ли он пустым (-s проверяет, что файл существует и не пустой
# Если файл существует, он выполняется (\. "$NVM_DIR/nvm.sh"), что загружает nvm в вашу оболочку, позволяя использовать команды nvm в текущей сессии.
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# Автоматическое переключение при открытии терминала в нужной директории
if [ -f .nvmrc ]; then
  nvm use
fi

# При переходе в директорию (использовании команды cd) проверяется наличие .nvmrc и вызов nvm use
cd() {
  builtin cd "$@" || return
  if [ -f .nvmrc ]; then
    nvm use
  fi
}

########################
########################
########################

Все! Теперь при открытии нового терминала или при использовании комнды cd для перехода в другую директорию, скрипт проверит наличие файла .nvmrc и при его наличии запустит команду nvm use.

Решение от NVM

Сам NVM предлагает и свое решение.

# place this after nvm initialization!
autoload -U add-zsh-hook

load-nvmrc() {
  local nvmrc_path
  nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version
    nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
      nvm use
    fi
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

Давайте разберем их скрипт. Cкрипт предназначен для автоматического переключения версии Node.js с помощью `nvm` (Node Version Manager) при изменении директории в терминале, если в этой директории присутствует файл `.nvmrc`, который указывает нужную версию Node.js.

Давайте разберём каждую часть скрипта:

1. autoload -U add-zsh-hook

Эта команда загружает функцию add-zsh-hook, если она ещё не загружена. add-zsh-hook используется для добавления хуков (hooks) в zsh.

2. Функция load-nvmrc

- local nvmrc_path: Объявляет локальную переменную nvmrc_path, которая будет хранить путь к файлу .nvmrc.

- nvmrc_path="$(nvm_find_nvmrc)": Функция nvm_find_nvmrc ищет файл .nvmrc в текущей директории или в родительских директориях. Если файл найден, его путь сохраняется в nvmrc_path.

- Проверка if [ -n "$nvmrc_path" ]; then: Если путь к файлу .nvmrc найден (т.е. `nvmrc_path` не пустой), то выполняется следующий блок кода:

- local nvmrc_node_version: Объявляет локальную переменную для хранения версии Node.js, указанной в файле .nvmrc.

- nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")"): Получает версию Node.js из файла .nvmrc и сохраняет её в nvmrc_node_version.

- if [ "$nvmrc_node_version" = "N/A" ]; then: Если версия Node.js не найдена (nvm возвращает "N/A"), то устанавливается версия Node.js из файла .nvmrc с помощью nvm install.

- elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then: Если текущая версия Node.js отличается от версии в .nvmrc, то выполняется nvm use для переключения на нужную версию.

- elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then: Если файл .nvmrc отсутствует, но в предыдущей директории он был, и текущая версия Node.js не совпадает с версией по умолчанию, то:

- Выводится сообщение "Reverting to nvm default version" и выполняется nvm use default, чтобы переключиться на версию Node.js по умолчанию.

3. add-zsh-hook chpwd load-nvmrc:

- Добавляет хук на событие chpwd (изменение директории) и связывает его с функцией load-nvmrc. Это означает, что при каждом изменении директории будет вызываться функция load-nvmrc.

4. load-nvmrc:

- Выполняет функцию load-nvmrc сразу же после инициализации, чтобы применить нужную версию Node.js при первом запуске терминала.

Этот скрипт помогает автоматически управлять версиями Node.js при переходе между проектами с разными версиями, указанными в .nvmrc. Скрипт более продуманный, но и как видно, более сложный.

Windows

На Windows для управления версиями Node.js и работы с файлами .nvmrc есть несколько подходов, поскольку nvm (Node Version Manager) изначально не поддерживает Windows. Однако существует несколько альтернатив и способов адаптировать рабочий процесс

1) Использование nvm-windows (Node Version Manager for Windows):

nvm-windows — это альтернатива nvm специально для Windows. Она поддерживает переключение версий Node.js и чтение файла .nvmrc. Вот как это настроить:

Установка nvm-windows:

1. Загрузите nvm-windows с официального репозитория GitHub.

2. Установите его, следуя инструкциям установщика.

Использование файла .nvmrc:

1. Убедитесь, что в директории вашего проекта есть файл .nvmrc, содержащий нужную версию Node.js.

2. Откройте командную строку или PowerShell и перейдите в директорию вашего проекта.

3. Введите команду:

nvm use

Это автоматически прочитает версию Node.js из файла .nvmrc и переключится на неё.

Автоматизация процесса:

Чтобы nvm use выполнялся автоматически при запуске терминала в нужной директории, можно создать сценарий в PowerShell профиле или командной строке, который будет вызываться при открытии сессии. Например, в PowerShell:

if (Test-Path .nvmrc) {
  $version = Get-Content .nvmrc
  nvm use $version
}

Добавьте этот скрипт в ваш профиль PowerShell ($PROFILE), чтобы он выполнялся при каждом запуске PowerShell.

2) Использование Windows Subsystem for Linux (WSL):

Я все же настоятельно рекомендую использовать Linux-окружение на Windows и для этого вы можете использовать WSL (Windows Subsystem for Linux). В этом случае вы можете установить стандартный nvm в своем Linux-дистрибутиве и работать с ним так же, как и на любой другой Unix-подобной системе.

Установка WSL:

1. Установите WSL, следуя официальным инструкциям от Microsoft.

2. Установите свой любимый Linux-дистрибутив (например, Ubuntu).

Установка nvm:

1. Откройте терминал WSL.

2. Следуйте стандартным инструкциям по установке nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

3. Используйте nvm и .nvmrc, как это описано ранее.

Заключение

Всего за пару минут мы автоматизировали переключение версий NodeJS. Надеюсь статья была полезной - если да - обязательно поделись ею! Удачи!



Поделиться: