Elixirのバージョン管理環境をasdfを使って作った

Debian Linux 8.9な環境でElixirを使わないといけなくなったがやけど、OSXでbrewで構築しているElixirとバージョンが違うことが判明したきOSXで異なるバージョンのElixirを使う方法を調べました。


- 2021/08/26　修正：いま時点のシェル設定方法に変更。@kikuyuta さんありがとうございました。
- 2019/05/31　追記：最近だと`brew install asdf`できるようだけど、`git clone`する方法を書いてます。


|                                 | Erlang | Elixir |
|---------------------------------|--------|--------|
| Debian Linux 8.9                | 20.1   | 1.5.0  |
| macOS High Sierra(10.13.6) brew | 21.1   | 1.7.4  |


# ざっくりまとめると

- Elixirのバージョンを切り替えて使いたい
 - もっと言うと古いバージョンのElixirを使いたい状況になった
- kiexとasdfを比較してasdfを採用した（ちゃんと開発が続きゆため）
- brewでインストールしたErlang/Elixirはアンインストールする必要がある
- できた＼(^o^)／


# 環境
OS: macOS High Sierra 10.13.6
Elixir: `% brew install elixir`でインストール

```shell
% iex --version
Erlang/OTP 21 [erts-10.1.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

IEx 1.7.3 (compiled with Erlang/OTP 21)
```


# Erlang/Elixirをアンインストール
Erlang/Elixirの管理方法が変わるきbrewでインストールしているErlang/Elixirをアンインストールします。`brew uninstall`コマンドだけやったらアンインストールされるのは直近のバージョンだけみたいやき、「--force」オプションをつけてコマンドを実行します。Erlang 1.6GBもあったのか…。

```shell
% brew uninstall --force erlang elixir
Uninstalling erlang... (34,012 files, 1.6GB)
Uninstalling elixir... (826 files, 11MB)
```


# asdf環境構築
[公式サイト](https://github.com/asdf-vm/asdf)の[README](https://github.com/asdf-vm/asdf/blob/master/README.md)どおりに実行します。

```shell
必要なソフトをインストール
% brew install coreutils automake autoconf openssl libyaml readline libxslt libtool unixodbc

asdf関連ファイルをgit clone
% git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.6.0

シェルを設定
<bashの場合>
公式ドキュメント通りに以下を実行して .bash_profile に必要な設定をする。
% echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ~/.bash_profile

<zshの場合>
公式ドキュメント通りに以下を実行して .zshrc に必要な設定をする。
% echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```


## Erlang/Elixirプラグインを追加

```shell
% asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
% asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
```

## インストール
Erlangのインストールは時間がかかるので注意。

```shell
% asdf install erlang 20.1
% asdf install erlang 21.1

% asdf install elixir 1.5.0
% asdf install elixir 1.7.4
```

## 使用するバージョンを指定
```shell
% asdf global erlang 20.1
% asdf global elixir 1.5.0
```


## 確認
まずはDebian想定のバージョンから。

```shell
% asdf current
elixir         1.5.0   (set by /Users/nishiuchi/.tool-versions)
erlang         20.1    (set by /Users/nishiuchi/.tool-versions)

% iex --version
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

IEx 1.5.0
```

brewでインストールした想定のバージョンに切り替えて確認:hugging:

```shell
インストールされちゅうバージョンを確認。
% asdf list
elixir
  1.5.0
  1.7.4
erlang
  20.1
  21.1

brewインストール想定のバージョンに切り替え。
% asdf global elixir 1.7.4
% asdf global erlang 21.1

利用するバージョンを確認。
% asdf current
elixir         1.7.4   (set by /Users/nishiuchi/.tool-versions)
erlang         21.1    (set by /Users/nishiuchi/.tool-versions)

切り替わっているかどうかiexで確認。
% iex --version
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

IEx 1.7.4 (compiled with Erlang/OTP 21)
```

ErlangとElixirのバージョンのペアが違っていた場合、Elixirがエラーを出して終了したりエラー出つつもなんとか起動しようとしたりするき注意が必要です（きっとダメ）。




## asdfコマンドメモ

- asdfのアップデート（Gitからインストールしている場合）

```shell
% asdf update
```

- プラグインを追加

```shell
(例) asdf plugin-add <name> <git-url>
% asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
% asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
```

- 利用可能なバージョンをリスト表示

```shell
(例) asdf list-all <name>
% asdf list-all elixir
```

- インストールされちゅうバージョンをリスト表示

```shell
(例) "asdf list" or "asdf list <name>"
% asdf list elixir
```

- 現在使っているソフトとバージョンをリスト表示

```shell
% asdf current
```

- インストール

```shell
(例) asdf install <name> <version>
% asdf install elixir 1.5.0
```

- アンインストール

```shell
(例) asdf uninstall <name> <version>
% asdf uninstall elixir 1.5.0
```


- globalとlocal

環境の切り替えが頻繁になければglobalで切り替え対応だけでいいっぽい。

```
erlangをインストールした時のメッセージから抜粋：
Erlang 20.1 has been installed. Activate globally with:

    asdf global erlang 20.1

Activate locally in the current folder with:

    asdf local erlang 20.1
```


# まとめ
- asdfを使ってErlang/Elixirの環境を切り替えて使えるようになりました
- エディタ（Atom）を再起動したらPATHを取ってきてくれてエディタ内でElixirを実行できるようになっちょった:hugging:


# 参考サイト
- [【言語バージョン管理】asdf使おう(erlang/elixir, node, etc...)](https://qiita.com/ymtszw/items/28cc7a000236510b71c2)
- [【Elixir】バージョン管理しつつErlangとElixirをMacにインストールする](http://otiai10.hatenablog.com/?page=1454569515)