हर बार निर्देशिका में .nvmrc फ़ाइल होने पर `nvm उपयोग` स्वचालित रूप से चलाएँ


87

मेरे शेल को कॉन्फ़िगर कैसे करें ताकि nvm useहर बार स्वचालित रूप से चलने पर निर्देशिका में .nvmrc फ़ाइल हो और जब कोई .nvmrc फ़ाइल न हो तो नवीनतम संस्करण या वैश्विक कॉन्फ़िगरेशन का उपयोग करें?


2
यह उपयोग मामला अब डीप शेल इंटीग्रेशन के तहत आधिकारिक एनवीएम दस्तावेज में दर्ज किया गया है । आप खोल के लिए मेरा जवाब भी देख सकते हैं । bash
d4nyll

जवाबों:


86

यदि आप zsh (z शेल) का उपयोग करते हैं :

एक .nvmrc फ़ाइल के साथ निर्देशिका में स्वचालित रूप से 'एनवीएम उपयोग' को कॉल करना

जब भी आप एक निर्देशिका में प्रवेश करते हैं जो nnm का उपयोग करते हुए एक स्ट्रिंग के साथ एक .nvmrc फ़ाइल दर्ज करते हुए nvm कॉल करने के लिए अपने $ 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

अधिक जानकारी: https://github.com/creationix/nvm#zsh


5
इसने मेरे लिए वास्तव में अच्छा काम किया, लेकिन एक प्रदर्शन हिट होने के कारण cd, क्योंकि यह हर बार जब आप निर्देशिकाओं को बदलते हैं। मैंने [[ -a .nvmrc ]] || returnलोड- nvmrc () की पहली पंक्ति में जोड़ा , और इससे इसके प्रदर्शन में काफी सुधार हुआ
बेल्गबद

@Belgabad यह अधिक प्रदर्शनकारी है, क्योंकि आपकी लाइन के साथ स्क्रिप्ट .nvmrcपेरेंट डाइरेक्टरीज़ के लिए जाँच नहीं करेगी और प्रोजेक्ट dir से बाहर nodeहोने पर यह डिफ़ॉल्ट संस्करण पर वापस नहीं जाएगी cd
रोटारटी

49

यदि आप बैश का उपयोग करते हैं तो आप इसे अपनी ~/.bashrcफ़ाइल में जोड़ सकते हैं :

enter_directory() {
  if [[ $PWD == $PREV_PWD ]]; then
    return
  fi

  PREV_PWD=$PWD
  [[ -f ".nvmrc" ]] && nvm use
}

export PROMPT_COMMAND=enter_directory

30

@Devius से शानदार जवाब ।

मैंने इसे अभी बढ़ाया है इसलिए यह एक निर्देशिका .nvmrcको बिना इसके साथ छोड़ते समय डिफ़ॉल्ट संस्करण पर वापस लौट सकता है।

~/.bashrc:

#
# Run 'nvm use' automatically every time there's 
# a .nvmrc file in the directory. Also, revert to default 
# version when entering a directory without .nvmrc
#
enter_directory() {
if [[ $PWD == $PREV_PWD ]]; then
    return
fi

PREV_PWD=$PWD
if [[ -f ".nvmrc" ]]; then
    nvm use
    NVM_DIRTY=true
elif [[ $NVM_DIRTY = true ]]; then
    nvm use default
    NVM_DIRTY=false
fi
}

export PROMPT_COMMAND=enter_directory

node v.0.0 (64-bit) is not installed..Nvmrc फ़ाइल में होने पर भी विंडो पर बैश का उपयोग करना 9.3
होफनरविले

2
का उपयोग करके फिक्स्डVERSION=$(cat .nvmrc); nvm use $VERSION
hofnarwillie

मुझे यह भी कहना चाहिए कि nvm-for-windows का उपयोग किया जा रहा है जो कि पूरी तरह से अलग जानवर है। लेकिन उपरोक्त स्क्रिप्ट + संशोधन के साथ यह एक इलाज का काम करता है। +1
हॉफर्नविली

26

मुझे अभी Node.js https://github.com/wbyoung/avn के लिए स्वचालित संस्करण स्विचिंग के बारे में पता चला है , आप इसका उपयोग कर सकते हैं।

आप इस सूत्र https://github.com/creationix/nvm/issues/110 का भी अनुसरण कर सकते हैं


28
यह निराशाजनक है .. क्या उपकरण स्टैक गहराई की कोई सीमा नहीं है? नोड → एनपीएम → एनवीएम → एवीएन, और बैक अप। sigh मैं गेंद खेलूँगा, लेकिन मेरा जुनून प्रत्येक हैक के साथ कम हो रहा है। (और लिंक के लिए धन्यवाद, ज़ाहिर है,
गाबो

उल्लिखित थ्रेड पर किसी भी टिप्पणी ने मेरे लिए काम नहीं किया। शायद वे सभी MacOS के लिए हैं। उबंटू में काम करने वाली किसी चीज़ के लिए नीचे दिए गए मेरे उत्तर की जाँच करें।
डेविस

12

यह उत्तर आधिकारिक एनवीएम प्रलेखन से लिया गया है ।

निम्नलिखित को अपने अंत में रखें $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)

        # Add the `v` suffix if it does not exists in the .nvmrc file
        if [[ $nvm_version != v* ]]; then
            nvm_version="v""$nvm_version"
        fi

        # If it is not already installed, install it
        if [[ $(nvm ls "$nvm_version" | tr -d '[:space:]') == "N/A" ]]; then
            nvm install "$nvm_version";
        fi

        if [[ $(nvm current) != "$nvm_version" ]]; then
            nvm use "$nvm_version";
        fi
    fi
}
alias cd='cdnvm'

यह एक सुधार है:

यह उपनाम किसी .nvmrcफ़ाइल का पता लगाने के लिए आपकी वर्तमान निर्देशिका से 'ऊपर' खोजेगा । यदि यह मिल जाता है, तो यह उस संस्करण में बदल जाएगा; यदि नहीं, तो यह डिफ़ॉल्ट संस्करण का उपयोग करेगा।


थोड़ा धीमा लगता है, लेकिन मुझे वास्तव में यह विकल्प पसंद है
बॉसमैन टीटी

@BossmanT 'थोड़ा धीमा' प्रतीत होता है, क्या आपका मतलब है कि आप अनुमान लगाते हैं कि यह देखने से धीमा है, या आप वास्तव में इसे चलाने के लिए धीमा पाया?
कॉलम

@ केवल मेरे बैश वातावरण में इसे चलाने से देखने से, इसके लिए कोई समय परीक्षण नहीं किया गया था, हालांकि, इसके बारे में एक दूसरे धीमे के एक अंश के बारे में, कुछ भी महत्वपूर्ण नहीं है
बॉसमैन

मैं किसी भी अंतराल का पता नहीं लगा सका। रनिंग cdकुछ ऐसा नहीं है जो आप कभी बड़े बैचों में कर सकते हैं, इसलिए मुझे नहीं लगता कि यह तब तक मायने रखता है जब तक कि अंतराल मानव के लिए ध्यान देने योग्य न हो।
कॉलम

2

मैंने इसके लिए कई समाधानों की कोशिश की और कुछ भी उस तरह से काम नहीं किया जैसा मैं चाहता था, इसलिए मैंने अपना लिखा:

नोड संस्करण को सही करने के लिए ZSH ऑटो-स्विच पर कार्य करता है

जहां तक ​​मुझे पता है, यह एकमात्र ऐसा है जो निम्नलिखित सभी मानदंडों को पूरा करता है:

  • की गारंटी देता है कि आप हमेशा निर्देशिका वृक्ष ऊपर खोज निकटतम खोजने के लिए सही संस्करण पर कर रहे हैं .nvmrc(जैसे nvm use);
  • किसी भी मान्य .nvmrcप्रारूप को संभाल सकता है ;
  • यदि कोई स्थापित संस्करण संतुष्ट नहीं करता है .nvmrc, तो आपको स्पष्ट रूप से चेतावनी देता है ,
  • मान लिया जाए कि defaultअगर .nvmrcपेड़ कहीं भी नहीं है ;
  • यदि आप पहले से ही सही नोड संस्करण पर हैं तो पूरी तरह से मौन और तेज है

1

फिर भी एक अन्य समाधान direnv का उपयोग कर । डिरेनेव ओएस एक्स और कई डिस्ट्रो के साथ आता है इसलिए किसी इंस्टॉलेशन की आवश्यकता नहीं है।

इन दो लाइनों को अपने .zshenv या .bash_profile में जोड़ें कि आप किस शेल का उपयोग करते हैं:


export NVM_DIR="$HOME/.nvm" # You probably have this line already
export NODE_VERSIONS="${NVM_DIR}/versions/node"
export NODE_VERSION_PREFIX="v"

सामग्री के साथ प्रोजेक्ट रूट में एक .envrc फ़ाइल जोड़ें

set -e
use node

अंत में अपनी निर्देशिका के लिए सीडी। (सोर्स .zshenv पर मत भूलना)

direnv आपको load config की अनुमति देने के लिए कहेगा। टाइप direnv allowऔर वॉइला!

ध्यान दें कि direnv जैसे फैंसी कंस्ट्रक्शन का समर्थन नहीं करता है lts/* । सकारात्मक पक्ष पर, direnv नोड, php, go, pyhton, ruby ​​जैसे रनटम्स के एक समूह का समर्थन करता है जो हमें पथ के मुद्दों को हल करने के लिए एक उपकरण का उपयोग करने की अनुमति देता है।


0

@ Adriano P के उत्तर पर विस्तार करते हुए , मैं इस संस्करण का प्रस्ताव करता हूं जो कम सामान्य है (केवल काम करता है यदि .nvmrcएक गिट रिपॉजिटरी रूट पर सेट किया गया है ), लेकिन उन मामलों में काम करता है जब हम प्रोजेक्ट में इसके रूट से कहीं और नेविगेट करते हैं:

_enter_dir() {
    local git_root
    git_root=$(git rev-parse --show-toplevel 2>/dev/null)

    if [[ "$git_root" == "$PREV_PWD" ]]; then
        return
    elif [[ -n "$git_root" && -f "$git_root/.nvmrc" ]]; then
        nvm use
        NVM_DIRTY=1
    elif [[ "$NVM_DIRTY" == 1 ]]; then
        nvm use default
        NVM_DIRTY=0
    fi
    PREV_PWD="$git_root"
}

export PROMPT_COMMAND=_enter_dir
#export PROMPT_COMMAND="$PROMPT_COMMAND;_enter_dir"  # use this if PROMPT_COMMAND already defined

0

मैं इस zsh कॉन्फ़िगरेशन ढांचे का उपयोग करता हूं, जिसे ओह माय Zsh कहा जाता है। यह नियमित अपडेट के साथ एक बहुत ही सक्रिय भंडार है। यह कोशिश करो और मुझे यकीन है कि आप इसे पसंद करेंगे। ओह, और इसमें ऑटोमैटिक .nvmrc फीचर बिल्ट-इन है, इसलिए यह पैकेज थ्रू npm को इंस्टाल करने जितना ही सरल है!

https://github.com/robbyrussell/oh-my-zsh


0

अभी भी उपरोक्त समस्या का सामना कर रहे किसी व्यक्ति के लिए README के nvmपास यह अनुभाग है जो सहायक होगा https://github.com/creationix/nvm#deeper-shell-integration

व्यक्तिगत रूप से मैं अन्य समाधानों पर .bashrc( https://github.com/creationix/nvm#automatically-call-nvm-use ) का संपादन पसंद करता हूं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.