asdfでCrystalを複数バージョン管理する(Mac・Linux)
最初に
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 Pluginとasdf-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-versions
にcrystal 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がスッカラカンで寂しいので、皆さんも書いていただけますと嬉しいです。
Discussion