Как написать файл.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семья. Эти менеджеры версий имеют большие преимущества перед другими.

  1. Он изменяет версию узла без изменения переменной среды PATHвремя от времени, потому что он использует исполняемые файлы совместимости. Это дает ему встроенную поддержку для автоматического переключения версии узла.
  2. Автоматическое переключение версии nodenv не нужно зацикливаться chpwdпериодически проверять смену каталога. Выбор версии откладывается до того момента, когдаnode команда выполняется.
  3. Команды в 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» поддерживает автоматическое переключение версий.

https://github.com/Schniz/fnm

Ответ с самым высоким рейтингом работает, но добавляет 0,2-0,5 секунды задержки на каждыйcd. Я добавил это в свой.zshrcи это практически мгновенно:

      #change nvm version on cd
cd() {
    builtin cd "$@" && [ -e ".nvmrc" ] && nvm use &> /dev/null
}

Все остальное можно взять из основного ответа.

Другие вопросы по тегам