Автоматически переключаться на правильную версию Node в зависимости от проекта

Допустим, у меня есть 2 проекта:

example1: requires node version 0.12.1
example2: requires node version 0.10

В настоящее время, когда я cd в каждом проекте я использую nvm use <version> перед запуском приложения.

Есть ли способ с узлом или nvm, чтобы автоматически переключаться на нужную версию узла, когда я cd в каждый проект?

10 ответов

Ищет .nvmrc файл в вашем текущем каталоге, каждый раз, когда вы cd, Если он найден, он загружает версию через nvm use и выбрасывает любой вывод.

cd() {
  builtin cd "$@"
  if [[ -f .nvmrc ]]; then
    nvm use > /dev/null
  fi
}
cd .

Установите автоматическое переключение версий узлов ( avn) и добавьте .node-version файл, который указывает версию, которую вы хотите использовать с проектом. Он автоматически обнаруживает и использует его через установленный менеджер версий, такой как nvm а также n,

Вы можете добавить команду nvm в файл package.json

"scripts": {
  "preinstall": "nvm install 0.12.1",
  "prestart": "nvm use 0.12.1",
  "start": "node ./file1.js"
},

Также установите желаемую версию в package.json, чтобы службы непрерывной интеграции знали, какую версию вы хотите использовать.

{
  "name": "naive",
  "description": "A package using naive versioning",
  "author": "A confused individual <iam@confused.com>",
  "dependencies": {
    "express": ">= 1.2.0",
    "optimist": ">= 0.1.0"
  },
  "engine": "node 0.4.1"
}

В README NVM GitHub также есть расширенные (созданные пользователем) сценарии оболочки bash / zsh:

bash скрипт

Автоматический звонок nvm use
Этот псевдоним будет искать "вверх" из вашего текущего каталога, чтобы обнаружить .nvmrcфайл. Если он его найдет, он переключится на эту версию; в противном случае будет использоваться версия по умолчанию.

Поместите следующее в конце вашего $HOME/.bashrc:

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'

zsh скрипт

Вызов nvm use автоматически в каталоге с .nvmrcфайл
Поместите это в свой$HOME/.zshrc звонить nvm use автоматически всякий раз, когда вы входите в каталог, содержащий .nvmrc файл со строкой, указывающей nvm, какой узел use:

# 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

NPM теперь давайте определим версию узла для проекта, подобного этому npm install node@8,

Так что в следующий раз вы делаете npm ci или же npm i, правильная версия устанавливается автоматически.

Если вы используете Ubuntu, попробуйте ниже,

       "scripts": {
  "prestart": ". ~/.nvm/nvm.sh && nvm use",
   ...
}

если вы создали .nvmrc file, то версию указывать не нужно.

Это то, что я сейчас использую для автоматической загрузки версии узла для каждого проекта. Он обновляет переменную для использования при вызове узла. Это предотвращает переключение версий узлов при каждом изменении каталога.

https://gist.github.com/ryanpback/1d0b2808f896398eab6106f49b3e99ab

Если вы используете оболочку Bash, вы можете определить псевдоним Bash для cd, который будет делать nvm install / nvm use для вас, когда он обнаруживает .nvmrc файл.

alias cd='function cdnvm(){ cd $@; if [[ -f .nvmrc ]]; then <.nvmrc nvm install; fi; };cdnvm'

Если вы хотите, чтобы версия узла вернулась к исходной по умолчанию, когда вы cd вне каталога используйте следующий псевдоним:

alias cd='function cdnvm(){ cd $@; if [[ -f .nvmrc && -s .nvmrc  && -r .nvmrc ]]; then <.nvmrc nvm install; elif [[ $(nvm current) != $(nvm version default) ]]; then nvm use default; fi; };cdnvm'

Если вас устраивает другой инструмент, вы можете использовать nvshim.

pip install nvshim  # this is all you need to do

Это не замедляет запуск вашей оболочки, вместо этого перемещая поиск версии узла, когда вы вызываете node, npm или npxпутем установки этих двоичных файлов. Подробнее в документации.

Источник, я написал инструмент.

Я думаю, что лучшим и абсолютно агностическим решением является установка Directory Enviroment ( direnv ), расширения для вашей оболочки. Он дополняет существующие оболочки новой функцией, которая может загружать и выгружать переменные среды в зависимости от текущего каталога.

Если вы используете bash в качестве оболочки, добавьте следующую строку в конце ~/.bashrcфайл:

      eval "$(direnv hook bash)"

Вместо этого, если вы используете другую оболочку, просто следуйте инструкциям по этой ссылке, введите здесь описание ссылки .

Затем вы должны добавить .envrcфайл внутри вашего проекта и указывает версию, которую вы хотите использовать:

      use nodejs 16

После этих шагов он автоматически обнаружит и использует указанную версию.

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