Using kerl with direnv
kerl
allows you to easily build and install multiple Erlang/OTP releases.
It’s kinda like nvm
or rvm
, but for Erlang. It doesn’t do everything, and
that’s what direnv
is for. direnv
allows you to run commands upon entering
or leaving a particular directory.
Installing direnv
direnv requires make and go to be installed, so on Ubuntu, that’s:
sudo apt-get install make golang
On Mac OS X, that’s:
brew update ; brew install go
Then follow (more-or-less) the instructions at https://github.com/zimbatm/direnv#install:
git clone http://github.com/zimbatm/direnv
cd direnv
make
sudo make install # sudo is optional on OS X.
To track the current directory, direnv hooks your shell. On bash, it
hooks $PROMPT_COMMAND
. To get this to work, add the following near the end of
your .bashrc
:
type -P direnv &>/dev/null && eval "$(direnv hook bash)"
This is slightly different from the installation instructions on the direnv homepage, because my bash profile is shared between all of the machines I use, and not all of them will have direnv installed.
Installing kerl
See https://github.com/yrashk/kerl#downloading, but it’s essentially this:
curl -O https://raw.githubusercontent.com/spawngrid/kerl/master/kerl
chmod +x kerl
Note that, if you put kerl in $PATH
for your primary user account, it
probably won’t be available when attempting to run it via sudo
, so it’s
probably easier to put it in (e.g.) /usr/local/bin
:
sudo mv kerl /usr/local/bin
Using kerl
to build and install Erlang
In this example, I’ll show building R16B03-1, with the default settings. This is the version used at Electric Imp at the time of writing.
kerl list releases
kerl build R16B03-1 r16b03-1
kerl list builds
sudo kerl install r16b03-1 /usr/local/erlang-R16B03-1
kerl list installations
Activating an Erlang version using kerl
. /usr/local/erlang-R16B03-1/activate
Combining kerl
with direnv
What if your team doesn’t use the same locations for installing Erlang versions
with kerl? Then you need the following in your .envrc
file:
ERLANG_VERSION=r16b03-1
if has kerl; then
ERLANG_INSTALLATION=$(kerl list installations | grep "^$ERLANG_VERSION " | cut -d' ' -f2)
if [ -x "$ERLANG_INSTALLATION/activate" ] ; then
echo "Using Erlang $ERLANG_VERSION (in $ERLANG_INSTALLATION) via kerl."
. $ERLANG_INSTALLATION/activate
else
echo "Erlang $ERLANG_VERSION not available; using default."
fi
else
echo "kerl not available; using default Erlang."
fi