Tired of typing nvm use
when working on multiple JS projects? Then try this Bash alias!
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'
This will search 'up' from your current directory in order to try and find a .nvmrc
file. If it finds it, it will use that version; if not, it will use the default version.
A previous iteration of this code only looks at the current directory, which means if your project directory has many nested directories, the inner directories would use the default version rather than the project's version.
The previous iteration is documented below:
alias cd='cdnvm(){ cd $1; if [[ -f .nvmrc && -s .nvmrc && -r .nvmrc ]]; then <.nvmrc nvm install; elif [[ $(nvm current) != $(nvm version default) ]]; then nvm use default; fi; };cdnvm'
This alias would automatically detect a .nvmrc
file in the directory you're cd
ing into, and switch to that version. And when you cd
back, it will automatically switch back to the default
version!
Or if you prefer a one-liner:
echo 'alias cd='\''cdnvm(){ cd $1; if [[ -f .nvmrc && -s .nvmrc && -r .nvmrc ]]; then <.nvmrc nvm install; elif [[ $(nvm current) != $(nvm version default) ]]; then nvm use default; fi; };cdnvm'\''' >> ~/.bashrc
Or if you prefer a more readable format:
cdnvm(){
cd $1
if [[ -f .nvmrc && -s .nvmrc && -r .nvmrc ]]; then
<.nvmrc nvm install;
elif [[ $(nvm current) != $(nvm version default) ]]; then
nvm use default;
fi
}
alias cd='cdnvm'
See it in action at https://asciinema.org/a/191898
Top comments (0)