Автоматическое переключение версий 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. Надеюсь статья была полезной - если да - обязательно поделись ею! Удачи!