Tuesday, May 5, 2020
direnv and .nvmrc
UPDATE 2021-07-19: I recommend checking “fnm on cd” post and starship.rs as well instead of suggestions in this article.
I am working in company that has many nodejs projects and they are
written with assumption that some older node version might be in
use. Node version is written in .nvmrc file and you have to
write command nvm use or fnm use after you enter project’s
directory. It is really easy to forget that and requires extra
typing every time you open new terminal tab/window because you
need that environment again.
So I have decided to automate that and it is quite easy to do. You need to install direnv (it is available via apt or brew, depending on your OS).
Now let’s create fnm rule for direnv. You will need to add following lines to ~/.config/direnv/direnvrc file:
use_fnm() {
fnm use
}
NOTE: if you are using nvm replace fnm use to nvm use. Both
fnm and nvm understand .nvmrc file.
Now create .envrc near .nvmrc with string use fnm.
Next time you will cd into your project fnm use will be run
automatically for you. You will need to run direnv allow the
very first time because direnv runs .envrc commands
automatically only for allowed folders.
But let’s not stop here and do a little bit more.
Many projects
Let assume you have many projects and you don’t want to create
.envrc for each by hand. We can create them with this simple
fd command:
fd --hidden .nvmrc -x sh -c "echo 'use fnm' > {//}/.envrc"
Feel free to use find command if you want to install fd :smirk:
Git and .envrc
Now let’ assume your co-workers don’t want to see .envrc
committed to git repository for some reason. In order to solve
that create global ~/.gitconfig file if you have not done that
yet. Add excludesfile into it:
[core]
excludesfile = ~/.gitignore_global
And add .envrc to ~/.gitignore_global file:
.envrc
That’s it. You will not commit .envrc accidentally anymore.
Bash and node version
Lastly you might want to see your current node version always as
we are running fnm use automatically. The solution is to add
following lines to your bash configuration file.
show_node_version() {
node -v
}
PS1='[N:$(show_node_version)]'$PS1
I hope you have found this useful.