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でインストール

% 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もあったのか…。

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

asdf環境構築

公式サイトREADMEどおりに実行します。

必要なソフトをインストール
% 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プラグインを追加

% 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のインストールは時間がかかるので注意。

% asdf install erlang 20.1
% asdf install erlang 21.1

% asdf install elixir 1.5.0
% asdf install elixir 1.7.4

使用するバージョンを指定

% asdf global erlang 20.1
% asdf global elixir 1.5.0

確認

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

% 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でインストールした想定のバージョンに切り替えて確認

インストールされちゅうバージョンを確認。
% 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からインストールしている場合)
% asdf update
  • プラグインを追加
() 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
  • 利用可能なバージョンをリスト表示
() asdf list-all <name>
% asdf list-all elixir
  • インストールされちゅうバージョンをリスト表示
() "asdf list" or "asdf list <name>"
% asdf list elixir
  • 現在使っているソフトとバージョンをリスト表示
% asdf current
  • インストール
() asdf install <name> <version>
% asdf install elixir 1.5.0
  • アンインストール
() 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を実行できるようになっちょった

参考サイト