All Articles

anyenv vs asdf vs Docker で asdf を使う理由

はじめに

プログラミング言語の複数バージョンを管理するツールとして nodenv や rbenv などが有名です。 さらに、複数のプログラミング言語の複数バージョンを管理するツールとして、anyenv や asdf が存在します。

この 2 つのツールを比較し、自分は今後 anyenv ではなく asdf を採用することに決めたので、その理由を解説します。 また、開発環境として一般的になってきている Docker を使う場合とも比較します。

anyenv より asdf をオススメする理由

まず anyenv より asdf をオススメする理由は以下のようになります。

  • anyenv と異なり、1 つ使い方を覚えれば良い
  • CLI ツールを含む多数のプラグインがある
  • ○○env の設定ファイル (.ruby-version や .node-version) と互換性がある
  • anyenv がメンテナンスされていない

anyenv と異なり、1 つ使い方を覚えれば良い

anyenv は nodenv や rbenv などの ○○env を管理するツールなので、nodenv や rbenv などの使い方もそれぞれ知る必要があります。 それぞれかなり似た使い方ではあるものの、1 つに統一されている方が嬉しいです。

CLI ツールを含む多数のプラグインがある

All Plugins のページに書かれているように、asdf には非常にたくさんのプラグインがあります。 特に kubectl や terraform のようにバージョンの違いでそこそこ変更がある CLI ツールを使っている場合は重宝します。

○○env の設定ファイル (.node-version や .ruby-version) と互換性がある

~/.asdfrc の設定により、.node-version や .ruby-version に記述されたバージョンを使うことが可能です。 なので、すでに nodenv や rbenv などで管理されている場合でも asdf に切り替えるのは簡単です。

anyenv がメンテナンスされていない

anyenv は 1 年以上メンテナンスされておらず、プルリクエストもオープンのまま放置されたりしています。 対して、asdf は現在高頻度でメンテナンスされています。

Docker による開発構築との比較

最近では Docker (Docker Compose) を使って開発環境を用意することも多いです。

Docker を使った開発環境を、asdf などをホストマシンで直接使った開発環境と比較すると、メリット・デメリットはおおよそ以下のようになると思います。

  • Docker を使った開発環境のメリット

    • docker-compose up だけで環境構築が完了するなど、環境構築で実行すべきコマンドが少ないため、チームに参加後すぐに開発を開始できる
    • 環境の差異がほとんどなくなるため、再現性が非常に高い
  • Docker を使った開発環境のデメリット

    • Docker の知識がないと困る場面が少なくない
    • ちょっとしたことをしたいだけでもコンテナ上でコマンドを打つことになって面倒
    • Docker for Mac のパフォーマンスが非常に悪い

再現性の高さは asdf や○○env でも十分な気もしますので、Docker を使う実質的なメリットは、初期構築コストの低さぐらいではないかと思います。

そんなこともあり、個人的な使い分けとしては、開発する言語のランタイムは asdf で用意して、ローカルの DB などは Docker で用意することが多いです。 ローカルの DB の用意はホストに直接インストールするよりも Docker を使う方がほぼ確実に楽なので、そこは Docker を使いましょう。

asdf 導入時にエラーが発生したら

最後に、asdf を導入しようとして遭遇したエラーについて書いておきます。

私が asdf を試そうとした際、Node.js や Ruby などをインストールしようとして、システムの依存関係が不足していることによるエラーに遭遇しました。

こういったエラーの対処方法は、そのプラグインの README をちゃんと読むことです。

asdf-nodejs であれば

Requirements

MacOS

asdf-ruby であれば

Please make sure you have the required system dependencies installed before trying to install Ruby.

のように、プラグイン利用時に必要な依存関係について書かれています。 この依存関係は asdf で自動的にインストールされることはないので、brew や apt などでインストールしましょう。

こういった依存関係の問題は rbenv などを使っていて遭遇したこともあるので、asdf に限った話ではないと思います。

参考

Web