asdfでCrystalを複数バージョン管理する(Mac・Linux)

4 min read読了の目安(約4400字

最初に

asdfでCrystalのバージョンを切り替えたりとバージョン管理する方法を紹介します。
asdfはMac・Linux対応のツールなので、Windowsで管理したい方はWSLからasdfを使うといいのかもしれません。

asdfに辿り着くまでの経緯

MacのhomebrewでCrystal 1.0.0をインストールしてましたが、Crystal 0.33.0を使いたいレポジトリがでてきました。
最新の1.0.0と一昔前の0.33.0を切り替えて使えるようになりたいです。
Mac・LinuxでRubyのバージョン管理をするツールだと、rbenvが有名です。
Crystalでも似た名前のcrenvを見つけましたが、最新コミットが2019年4月で、1番最新のIssue#047も2020年1月で「Looking for a maintainer」とあり、そのIssueを読むと既に開発は止まっており、代替としてasdfなるものが使えることがわかりました。

本文のコマンドについての注意点

一般的な話ですが、コマンドを実行する際に、コマンドであることがわかるように先頭に$を記載しています。
誤ってコピペしたり、$もコマンドの一部と誤解しないよう注意して下さい。

asdfのインストールの前に、既存のcrystalを使えなくする

自分の場合ですが、MacでhomebrewでインストールしたCrystalが既にありました。
これからは、asdfでインストールしたasdfの管理下においたCrystalを切り替えて使う予定ですが、
asdf管理外のcrystalコードが使えると紛らわしいので、既にインストール済みのCrystalは最初に使えないようにするとよさそうです。
Macでhomebrew管理下にあるCrystalなら、次のコマンドを実行するとcrystalコマンドが使えなくなります。

$ brew unlink crystal
Unlinking /usr/local/Cellar/crystal/1.0.0_1... 7 symlinks removed.

もし元に戻したかったら、反対にbrew link crystalとすれば、元に戻って再び使えるようになります。

asdfの使い方

asdfはCrystal以外にもあらゆるバージョン管理をするツールです。
Crystalで使えるようになると、他でも使える機会がありそうで便利そうです。

asdfのインストール

まずasdfのインストールからします。
公式のManage asdfから読んでやっていきます。

使っている機種に応じてmacOSかLinuxか選択します。
macOSでもインストール方法が色々とでてきますが、HomebrewやGitを選ぶといい気がします。
よく使われているものであれば利用者が多くてバグが見つかって潰れてる可能性が高いのではぐらいの考えです。

選択するとコマンドがでてくるので、順番に実行していきます。
自分はhomebrewを使ってasdfをインストールしました。

$ brew install asdf

インストールできてれば、次のコマンドでバージョンがでます。

$ asdf version
v0.8.1

一般にコマンド名 -vでバージョンを調べられることが多いですが、asdfはそうじゃないんですね。

asdfをshellに適用させる

Add to your Shellのところでは、御自身の使っているshellを選択します。

bashかzshか間違えると、立ち上げるたびに自動的に読み込まれなかったりして困るので、御自身のshellがわからない方は調べましょう。

なお、最新Macのデフォルトはzshですが、一昔前まではbashでした。
asdfの公式説明はデフォルトがbashになっているので、zshを使っている方は気をつけましょう。

zshでhomebrewという項目を選択すると、次のようなコマンドがでます。

$ echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

このコマンドを打つと、~/.zshrcにasdfのスクリプトを起動させるように書き込んでいます。
~/.zshrcを見てると、最後に書き込まれるはずです。
このタイミングで次のコマンドを読み、~/.zshrcを実行させるといい気がします。

$ source ~/.zshrc

asdfでCrystalのpluginをインストールする

asdfのインストール&設定が完了したら、Manage Pluginasdf-community/asdf-crystalを見て、
asdfでCrystalを管理するための追加ツール(plugin)をインストールします。
これは、asdf-communityの管理で作成されているようです。

$ asdf plugin-add crystal https://github.com/asdf-community/asdf-crystal.git

このコマンドはplugin-addでもplugin addでも、どちらでもいいように対応されているようです。

$ asdf plugin list

上記のコマンドを実行すると、ローカルにインストールしたpluginが表示されます。
ここにcrystalの文字がでれば、Crystal用のpluginがインストールされています。

asdfでCrystalをインストールする

Manage Versionsを見ていきます。
今回自分が欲しかったのは最新1.0.0と0.33.0なので、次のコマンドを実行します。

$ asdf install crystal latest
$ asdf install crystal 0.33.0

下記のコマンドで、ローカルにインストールしたCrystalのバージョンを確かめられます。

$ asdf list crystal  

このコマンドで切り替えて使いたいバージョンがリストされたら、インストール成功です。

また、インストールできる全てのバージョンを見たいときは、次のようなコマンドになります

$ asdf list all crystal

asdfでCrystalのバージョンを切り替える

Rubyのrbenvを使っている方は、すぐ馴染めるコマンドだと思います。

globalで設定する方法

$ asdf global crystal 1.0.0

これで、グローバルのCrystalのバージョンを切りかえます。
公式の説明にあるように、ホームディレクトリの~/.tool-versionscrystal 1.0.0と書き加えられ、この設定が使われます。

特定のバージョンで固定しておきたいところでは、そのディレクトリ(アプリ)にいって、次に説明するlocalコマンドを使います。

局所的にlocalで設定する方法

次にローカルで設定する方法です。

$ asdf local crystal 0.33.0

このコマンドを打つと、そのディレクトリに.tool-verssionが作られ、crystal 0.33.0と書き加えられます。
このディレクトリにある.tool-versionsは、globalで設定されるホームディレクトリの.tool-versionsより優先されます。

ちゃんと適用されているか調べる方法

色々あると思いますが、ちゃんとバージョンが切り替わっているか見ていきます。

次のコマンドを打つと、今適用されるcrystalのバージョンとソースがわかります。

$ asdf current crystal
crystal         1.0.0          ~/.tool-versions

asdfの設定を使わなくても、crystalコマンドで確かめることもできるはずです。

$ crystal -v
Crystal 0.33.0 (2020-02-14)

LLVM: 6.0.1
Default target: x86_64-apple-macosx

このあたりでバージョンがでるのに切り替わらなかったりすると、asdf以外でhomebrew等でインストールしたCrystalが優先されて使われている可能性があります。zshなら~/.zshrcのパスやエイリアスなどを見直してみるといいかもしれません。

$ which crystal

上記のコマンドでどの場所のcrystalが呼ばれているのか確かめるといいです。

最後に

だいたいは公式ドキュメントを読めばいいものの、参考になれば幸いです。

話は代わりますが、Crystalも遂にバージョン1.0.0がでたのに、CrystalのAdvent Calendar 2020がスッカラカンで寂しいので、皆さんも書いていただけますと嬉しいです。