dizinde her .nvmrc dosyası olduğunda otomatik olarak `nvm use` çalıştır


88

Nasıl benim kabuk yapılandırmak için böylece nvm usevadede bir .nvmrc dizinde dosya ve kullanımı son sürümü ya da hiç .nvmrc dosya var global yapılandırma var otomatik olarak her zaman?


2
Bu kullanım durumu artık Deep Shell Entegrasyonu altındaki resmi nvm belgelerinde belgelenmiştir . Kabuk için cevabımı da görebilirsiniz . bash
d4nyll

Yanıtlar:


89

Eğer kullanırsanız zsh (z kabuk):

.Nvmrc dosyası içeren bir dizinde otomatik olarak 'nvm kullanımı' çağrısı

Bunu $ HOME / .zshrc'nize koyun ve nvm'yi hangi düğümün kullanılacağını belirten bir dizeyle .nvmrc dosyası içeren bir dizine her girdiğinizde otomatik olarak nvm kullanımını çağırmak için:

# 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

Daha fazla bilgi: https://github.com/creationix/nvm#zsh


6
Bu benim için gerçekten işe yaradı, ancak cddizinleri her değiştirdiğinizde çalıştığı için bir performans düşüşüne neden oldu . I ilave [[ -a .nvmrc ]] || returnyük nvmrc () birinci hattına ve önemli ölçüde bunun geliştirilmiş performans
Belgabad

1
@Belgabad Daha performanslı, çünkü satırınızla birlikte komut dosyası .nvmrcana dizinlerde kontrol etmeyecek ve ayrıca proje dizininden nodeçıktığınızda varsayılan sürüme geri dönmeyecektir cd.
Rotareti

50

Bash kullanıyorsanız , bunu ~/.bashrcdosyanıza ekleyebilirsiniz :

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

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

export PROMPT_COMMAND=enter_directory

33

@Devius'tan mükemmel yanıt .

Bir dizini .nvmrconsuz bir başkasına bırakırken varsayılan sürüme geri dönebilmesi için genişlettim .

~/.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

Windows üzerinde bash kullanıldığında node v.0.0 (64-bit) is not installed., .nvmrc dosyası olsa bile bu geri döner 9.3.
hofnarwillie

2
Kullanılarak düzeltildiVERSION=$(cat .nvmrc); nvm use $VERSION
hofnarwillie

Ayrıca bunun tamamen farklı bir canavar olan Windows için nvm kullandığını da söylemeliyim. Ancak yukarıdaki komut dosyası + modifikasyonu ile bir tedavi işe yarar. +1
hofnarwillie

26

Node.js https://github.com/wbyoung/avn için Otomatik Sürüm Değiştirme hakkında yeni öğrendim , bunu kullanabilirsiniz.

Bu konuyu da takip edebilirsiniz https://github.com/creationix/nvm/issues/110


32
Bu iç karartıcı .. Takım yığını derinliğinde bir sınır yok mu? düğüm → npm → nvm → avn ve yedekleyin. iç çekip top oynayacağım ama tutkum her hack'le azalıyor. (ve bağlantı için teşekkürler, tabii ki gabo.)
hraban

Bahsedilen başlıktaki yorumların hiçbiri benim için bash ile çalışmadı. Belki hepsi MacOS içindir. Ubuntu'da çalışan bir şey için aşağıdaki cevabımı kontrol edin.
devius

15

Bu cevap resmi nvm belgelerinden alınmıştır .

Aşağıdakileri sayfanızın sonuna koyun $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'

Bu, şunlara göre bir gelişme

Bu takma ad, bir .nvmrcdosyayı tespit etmek için mevcut dizininizden 'yukarı' arama yapacaktır . Bulursa, o sürüme geçecektir; değilse, varsayılan sürümü kullanacaktır.


Biraz yavaş görünüyor ama bu seçeneği gerçekten seviyorum
BossmanT

@BossmanT 'Biraz yavaş görünüyor' ile, ne yaptığına bakmanın yavaş olduğunu mu tahmin edeceğinizi mi yoksa gerçekten koşmayı yavaş bulduğunuzu mu söylüyorsunuz?
callum

@callum sadece benim bash ortamımda çalışmasını gözlemlediğim için hiçbir zaman denemesi yapılmadı, ancak bir saniyenin bir kısmı daha yavaş, elbette önemli bir şey değil
BossmanT 25'19

Herhangi bir gecikme tespit edemedim. Koşmak cd, büyük gruplar halinde yapma olasılığınız olan bir şey değildir, bu yüzden gecikme bir insan tarafından fark edilmediği sürece önemli olduğunu düşünmüyorum.
callum

3

Bunun için birçok çözüm denedim ve hiçbir şey istediğim gibi çalışmadı, bu yüzden kendim yazdım:

Doğru Düğüm sürümüne otomatik geçiş için ZSH işlevi

Bildiğim kadarıyla, aşağıdaki kriterlerin tümünü karşılayan tek kişi bu:

  • en yakını bulmak için dizin ağacını arayarak her zaman doğru sürümde olduğunuzu garanti eder .nvmrc(aynı şekilde nvm use);
  • herhangi bir geçerli .nvmrcbiçimi işleyebilir ;
  • Yüklü bir sürümün .nvmrc,
  • İstediğiniz varsayar defaulthiçbir yoksa .nvmrcağacın yukarı her yerde;
  • zaten doğru Düğüm sürümündeyseniz tamamen sessiz ve hızlıdır .

1

Yine direnv kullanarak başka bir çözüm . Direnv, OS X ve birçok dağıtımla birlikte gelir, bu nedenle kurulum gerekmez.

Kullandığınız kabuğa bağlı olarak bu iki satırı .zshenv veya .bash_profile dosyanıza ekleyin:


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

İçeriği olan proje köküne bir .envrc dosyası ekleyin

set -e
use node

Sonunda dizininize cd yapın. (.Zshenv kaynağını unutmayın)

direnv sizden yükleme yapılandırmasına izin vermenizi isteyecektir. Yazın direnv allowve işte!

Direnv'in .nvrmc'deki gibi süslü yapıları desteklemediğini lts/*unutmayın. Olumlu tarafı, direnv node, php, go, pyhton, ruby ​​vb. Gibi yol sorunlarını çözmek için tek bir araç kullanmamıza izin veren bir dizi çalışma zamanını destekler.


0

@Adriano P cevabını genişleterek , daha az genel olan bu sürümü öneririm (yalnızca .nvmrcbir git deposu kökünde ayarlanmışsa çalışır), ancak projede kökünden başka bir yere gittiğimizde çalışır:

_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

Oh My Zsh adlı bu zsh yapılandırma çerçevesini kullanıyorum. Düzenli güncellemeleri olan çok aktif bir havuz. Deneyin ve eminim seveceksiniz. Oh, ve yerleşik otomatik .nvmrc özelliğine sahiptir, bu nedenle paketi npm aracılığıyla yüklemek kadar basittir!

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.