© 2020 WebHive

Автозагрузка нужной версии node.js в zsh с помощью nvm

В последнее время довелось много поработать с node.js. Разные проекты требуют разных версий ноды. Управлять этим зоопарком сильно помогает NVM. Но как бы ни было это удобно часто забываю переключить версию при переходе в папку другого проекта. Пора покончить с этим безобразием и переложить всю грязную рутину на плечи компьютера и я покажу как это сделать.

По счастью можно указать NVM какую версию использовать в данном проекте создав файл .nvmrc в папке проекта. Например такой:

1
2
$ cat .nvmrc
v7.8.0

Но чтобы NVM сожрал этот файл необходимо руками вызвать команду nvm use, что неудобно. Особенно раздражает запустив обновление пакетов обнаружить, что они установились не в ту версию.

Что же я хочу?

Хочу я немногого — при смене папки на папку с файлом .nvmrc автоматически переключать версию node.js на версию, указанную в этом файле и таким образом не отвлекаться на контроль за тем какая версию активна в данный момент.

Готовые решения

Так как в качестве шелла пользуюсь я zsh, то дальнейшее повествование именно о нём. Нехитрым гуглением обнаруживаем разные варианты решения. Например родное решение от авторов NVM или вот такой плагинчик к zsh — nvm-auto.

Что с ними не так?

Всё, что я нашёл просто адово тормозит. Любой переход из папки в папку занимает пару секунд. Это очень много — это жутко раздражает и такое решения я считаю нерабочим. Не понимаю — неужели кто-то этим решениями действительно пользуется?

Почему так медленно

Всё дело в том, что анализ проводится на мой взгляд довольно странным способом. Средствами nvm запрашиваетс версия по умолчанию и версия требуемая и если они не совпадают, то запускается смена версии. Причём даже если нет файла .nvmrc всё равно — запускается переключение на версию по умолчанию

Пилю свой велосипед

Блин проблема-то яйца выеденного не стоит. Как не взять руки любимый напильник? За дело!

.zshrc
1
2
3
4
5
6
7
8
9
10
11
load-nvmrc() {
if [ -f '.nvmrc' ]; then
local required_version=`cat .nvmrc`
if [ `nvm version` != "$required_version" ]; then
nvm use "$required_version"
fi
fi
}

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

Вот такой кусок надо добавить в свой файл .zshrc. На смену папки вешается хук (строка 9), который и выполняет анализ ситуации и запускает nvm если нужно.

Чем же эта конструкция лучше? Она быстрая! Вся эта балалайка запускаетс только если есть в наличии файл .nvmrc и только если версия в нём отличается от текущей. Поэтому запускается редко, но метко.

Недостатком и расплатой за скорость является отсутствие возврата к версии по умолчанию при выходе из папки проекта — остаётся последняя выбранная версия. Но мне как-то нода сама по себе вне контекста какого проекта не нужна, поэтому мне это совершенно не важно, а высокая скорость работы и удобство с лихвой окупают этот небольшой недостаток.

Комментарии