Bagaimana cara mengkonfigurasi shell saya agar nvm use
berjalan secara otomatis setiap kali ada file .nvmrc di direktori dan menggunakan versi terbaru atau konfigurasi global ketika tidak ada file .nvmrc?
javascript
node.js
shell
nvm
Gabo Esquivel
sumber
sumber
bash
cangkangnya.Jawaban:
Jika Anda menggunakan zsh (z shell):
# 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
Info lebih lanjut: https://github.com/creationix/nvm#zsh
sumber
cd
, karena berjalan setiap kali Anda mengubah direktori. Saya menambahkan[[ -a .nvmrc ]] || return
ke baris pertama load-nvmrc (), dan itu secara signifikan meningkatkan kinerjanya.nvmrc
di direktori induk dan juga tidak akan kembali kenode
versi default saat Andacd
keluar dari direktori proyek.Jika Anda menggunakan bash, Anda dapat menambahkan ini ke
~/.bashrc
file Anda :enter_directory() { if [[ $PWD == $PREV_PWD ]]; then return fi PREV_PWD=$PWD [[ -f ".nvmrc" ]] && nvm use } export PROMPT_COMMAND=enter_directory
sumber
Jawaban luar biasa dari @devius .
Saya baru saja memperpanjangnya sehingga dapat kembali ke versi default ketika meninggalkan direktori dengan yang
.nvmrc
lain tanpa itu.~/.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
sumber
node v.0.0 (64-bit) is not installed.
meskipun file .nvmrc memiliki9.3
.VERSION=$(cat .nvmrc); nvm use $VERSION
Saya baru tahu tentang Pengalihan Versi Otomatis untuk Node.js https://github.com/wbyoung/avn , Anda dapat menggunakannya.
Anda juga dapat mengikuti utas ini https://github.com/creationix/nvm/issues/110
sumber
Jawaban ini diambil dari dokumentasi resmi nvm .
Letakkan yang berikut ini di akhir Anda
$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'
Ini merupakan peningkatan dari:
avn
)Alias ini akan mencari 'up' dari direktori Anda saat ini untuk mendeteksi
.nvmrc
file. Jika menemukannya, itu akan beralih ke versi itu; jika tidak, itu akan menggunakan versi default.sumber
cd
bukanlah sesuatu yang mungkin Anda lakukan dalam jumlah besar, jadi menurut saya itu tidak penting kecuali jika kelambatannya terlihat oleh manusia.Saya mencoba banyak solusi untuk ini dan tidak ada yang berhasil seperti yang saya inginkan, jadi saya menulis sendiri:
Fungsi ZSH untuk beralih otomatis ke versi node yang benar
Sejauh yang saya tahu, ini adalah satu-satunya yang memenuhi semua kriteria berikut:
.nvmrc
(sepertinvm use
);.nvmrc
format apa pun yang valid ;.nvmrc
,default
jika tidak ada.nvmrc
tempat di atas pohon;sumber
Namun solusi lain menggunakan direnv . Direnv hadir dengan OS X dan banyak distro sehingga tidak diperlukan instalasi.
Tambahkan dua baris ini ke .zshenv atau .bash_profile Anda tergantung pada shell yang Anda gunakan:
export NVM_DIR="$HOME/.nvm" # You probably have this line already export NODE_VERSIONS="${NVM_DIR}/versions/node" export NODE_VERSION_PREFIX="v"
Tambahkan file .envrc ke root proyek dengan isinya
set -e use node
Terakhir, cd ke direktori Anda. (Jangan lupa untuk mencari .zshenv)
direnv akan meminta Anda untuk mengizinkan konfigurasi beban. Ketik
direnv allow
dan voila!Perhatikan bahwa direnv tidak mendukung konstruksi mewah seperti
lts/*
di .nvrmc. Sisi positifnya, direnv mendukung banyak runtime seperti node, php, go, pyhton, ruby, dll. Memungkinkan kita menggunakan satu alat untuk memecahkan masalah jalur.sumber
Memperluas jawaban @Adriano P , saya akan mengusulkan versi ini yang kurang umum (hanya berfungsi jika
.nvmrc
disetel pada root repositori git ), tetapi berfungsi jika kita menavigasi ke tempat lain dalam proyek selain akarnya:_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
sumber
Saya menggunakan kerangka konfigurasi zsh ini yang disebut Oh My Zsh. Ini adalah repositori yang sangat aktif dengan pembaruan rutin. Cobalah dan saya yakin Anda akan menyukainya. Oh, dan ia memiliki fitur otomatis .nvmrc bawaan sehingga semudah menginstal paket melalui npm!
https://github.com/robbyrussell/oh-my-zsh
sumber
Untuk seseorang yang masih menghadapi masalah di atas, README untuk
nvm
memiliki bagian ini yang akan sangat membantu https://github.com/creationix/nvm#deeper-shell-integrationSecara pribadi saya lebih suka mengedit
.bashrc
( https://github.com/creationix/nvm#automatically-call-nvm-use ) daripada solusi lain.sumber