Как написать файл.nvmrc, который автоматически меняет версию узла
Привет у меня есть два проекта, один в angularjs 4.4.7, а другой в angular 6 версии. Мне нужно переключиться между версией узла для этого. Я пытался использовать NVM, который работает вручную. Как обработать изменение версии в программе angularjs, чтобы изменить версию узла, когда автоматически загружается последняя угловая страница. Есть ли такой способ? Я также прошел через #avn, но как создать файл.node-version. Может кто-нибудь помочь с любой ссылкой или исправить пример шагов
7 ответов
Как уже упоминал @Aditya-MP, вы можете запустить следующую команду внутри корневого каталога ваших проектов, чтобы сгенерировать .nvmrc
чтобы установить желаемую версию NodeJS для правильной работы вашего проекта:
node -v > .nvmrc
Это сгенерирует что-то подобное внутри вашего .nvmrc
файл:
v10.16.2
Также используя 10.16.2
без v
письмо будет работать нормально.
Однако в официальной документации в разделе .nvmrc никогда не упоминается, что как только вы создадите этот файл, указанная версия узла будет загружена автоматически. Так что этого недостаточно, вам нужно запустить команду выше, чтобыnvm
можно искать.nvmrc
файл для загрузки указанной версии:
nvm use
Вот гифка для демонстрации:
Для автозагрузки указанной версии узла:
Вам нужно добавить что-то еще в конфигурацию вашей оболочки в зависимости от того, что вы используете bash
илиzsh
Чтобы получить точную конфигурацию для каждого из них, следуйте инструкциям в соответствующем разделе конфигурации оболочки.
В моем случае я использую zsh
поэтому мне нужно добавить это в конец моего.zshrc
файл, и вот изображение, которое подтверждает, что он работает как шарм:
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$node_version" ]; then
nvm use
fi
elif [ "$node_version" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
Надеюсь, это может быть полезно для всех, кто сталкивается с тем же вопросом!
Проверьте README из репозитория nvm на GitHub. Там были даны решения.
Shell Integraton
Для bash поместите следующее в конец вашего$HOME/.bashrc
, оболочка изменит версию узла в соответствии с .nvmrc
файл в директории.
find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}
cdnvm(){
cd "$@";
nvm_path=$(find-up .nvmrc | tr -d '[:space:]')
# If there are no .nvmrc file, use the default nvm version
if [[ ! $nvm_path = *[^[:space:]]* ]]; then
declare default_version;
default_version=$(nvm version default);
# If there is no default version, set it to `node`
# This will use the latest version on your machine
if [[ $default_version == "N/A" ]]; then
nvm alias default node;
default_version=$(nvm version default);
fi
# If the current version is not the default version, set it to use the default version
if [[ $(nvm current) != "$default_version" ]]; then
nvm use default;
fi
elif [[ -s $nvm_path/.nvmrc && -r $nvm_path/.nvmrc ]]; then
declare nvm_version
nvm_version=$(<"$nvm_path"/.nvmrc)
declare locally_resolved_nvm_version
# `nvm ls` will check all locally-available versions
# If there are multiple matching versions, take the latest one
# Remove the `->` and `*` characters and spaces
# `locally_resolved_nvm_version` will be `N/A` if no local versions are found
locally_resolved_nvm_version=$(nvm ls --no-colors "$nvm_version" | tail -1 | tr -d '\->*' | tr -d '[:space:]')
# If it is not already installed, install it
# `nvm install` will implicitly use the newly-installed version
if [[ "$locally_resolved_nvm_version" == "N/A" ]]; then
nvm install "$nvm_version";
elif [[ $(nvm current) != "$locally_resolved_nvm_version" ]]; then
nvm use "$nvm_version";
fi
fi
}
alias cd='cdnvm'
Потому что в Bash нет поддержки хуков, решение выше уродливо.
Для zsh поместите это в свой$HOME/.zshrc
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$node_version" ]; then
nvm use
fi
elif [ "$node_version" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
Лучшее решение
Лучшее решение - использовать nodenv. Я не шучу,nodenv
сильно отличается от nvm, и n.
nodenv
является членом rbenv
семья. Эти менеджеры версий имеют большие преимущества перед другими.
- Он изменяет версию узла без изменения переменной среды
PATH
время от времени, потому что он использует исполняемые файлы совместимости. Это дает ему встроенную поддержку для автоматического переключения версии узла. - Автоматическое переключение версии
nodenv
не нужно зацикливатьсяchpwd
периодически проверять смену каталога. Выбор версии откладывается до того момента, когдаnode
команда выполняется. - Команды в
nodenv
реализованы в скриптах. А команды изnvm
реализованы в функциях, что означает, что все 4000+ строк кода должны быть проанализированы при запуске оболочки и значительно увеличивают время инициализации оболочки.nodenv
инициализируется намного быстрее.
Ссылки
Как указано в ветке GitHub, связанной с этим на nvm
В репозитории вы можете запустить следующую команду в каждой из ваших папок проекта Angular:
$ node -v > .nvmrc
Обратите внимание, что вам нужно сначала переключиться на правильную версию узла в каждом из ваших проектов, прежде чем запускать команду выше.
Что происходит в команде:
node -v
выйдет текущая версияnode
вstdout
,>
символ будет тогдаredirecting
вывод в файл с именем.nvmrc
(он будет перезаписан, если что-то уже существует с таким же именем файла).- Прочтите больше перенаправлений bash в разделе REDIRECTION на странице руководства bash: https://linux.die.net/man/1/bash
Когда ты cd
в ваши целевые каталоги, nvm
Теперь сначала прочитаем файл и автоматически переключимся на правильную версию.
После того, как вы создадите файл .nvmrc в корне вашего проекта с версией узла, которая вам нужна в этом проекте, что-то вроде
v12.20.0
Вы должны иметь возможность перейти в папку проекта и запустить
nvm use
. Это напечатает что-то вроде этого:
Found '/Users/you/myproject/.nvmrc' with version <v12.20.0>
Now using node v12.20.0 (npm v6.14.8)
Не существует автоматизированного способа AFAIK, предоставляемого NVM из коробки, за исключением создания сценария bash, который делает это для вас, что подробно описано в документации NVM здесь .
Для чего-то менее сложного, чем крючок для ракушки, вы можете добавить илиprebuild
скрипт в ваш package.json, поэтому каждый раз, когда вы пытаетесь установить или собрать проект, используется правильная версия, указанная в вашем файле.
Пример.nvmrc
файл:
18.10.0
Примеры скриптов вpackage.json
файл:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"preinstall": "nvm use",
"prebuild": "nvm use",
"build": "tsc"
},
Я еще не проверял это, но планирую вскоре добавить в свой проект. Я отчитаюсь, как это работает.
Примечание. Использованиеpreinstall
хук вызывается только при выполненииnpm install
а не при установке конкретного модуля.
«fnm» поддерживает автоматическое переключение версий.
Ответ с самым высоким рейтингом работает, но добавляет 0,2-0,5 секунды задержки на каждыйcd
. Я добавил это в свой.zshrc
и это практически мгновенно:
#change nvm version on cd
cd() {
builtin cd "$@" && [ -e ".nvmrc" ] && nvm use &> /dev/null
}
Все остальное можно взять из основного ответа.