{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/anyenv-asdf-docker","result":{"data":{"markdownRemark":{"id":"9a12200e-5ec2-5730-a20f-f75c84b0d597","html":"<h2 id=\"はじめに\" style=\"position:relative;\"><a href=\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" aria-label=\"はじめに permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>はじめに</h2>\n<p>プログラミング言語の複数バージョンを管理するツールとして nodenv や rbenv などが有名です。\nさらに、複数のプログラミング言語の複数バージョンを管理するツールとして、anyenv や asdf が存在します。</p>\n<p>この 2 つのツールを比較し、自分は今後 anyenv ではなく asdf を採用することに決めたので、その理由を解説します。\nまた、開発環境として一般的になってきている Docker を使う場合とも比較します。</p>\n<h2 id=\"anyenv-より-asdf-をオススメする理由\" style=\"position:relative;\"><a href=\"#anyenv-%E3%82%88%E3%82%8A-asdf-%E3%82%92%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1\" aria-label=\"anyenv より asdf をオススメする理由 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>anyenv より asdf をオススメする理由</h2>\n<p>まず anyenv より asdf をオススメする理由は以下のようになります。</p>\n<ul>\n<li>anyenv と異なり、1 つ使い方を覚えれば良い</li>\n<li>CLI ツールを含む多数のプラグインがある</li>\n<li>○○env の設定ファイル (.ruby-version や .node-version) と互換性がある</li>\n<li>anyenv がメンテナンスされていない</li>\n</ul>\n<h3 id=\"anyenv-と異なり、1-つ使い方を覚えれば良い\" style=\"position:relative;\"><a href=\"#anyenv-%E3%81%A8%E7%95%B0%E3%81%AA%E3%82%8A%E3%80%811-%E3%81%A4%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%92%E8%A6%9A%E3%81%88%E3%82%8C%E3%81%B0%E8%89%AF%E3%81%84\" aria-label=\"anyenv と異なり、1 つ使い方を覚えれば良い permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>anyenv と異なり、1 つ使い方を覚えれば良い</h3>\n<p>anyenv は nodenv や rbenv などの ○○env を管理するツールなので、nodenv や rbenv などの使い方もそれぞれ知る必要があります。\nそれぞれかなり似た使い方ではあるものの、1 つに統一されている方が嬉しいです。</p>\n<h3 id=\"cli-ツールを含む多数のプラグインがある\" style=\"position:relative;\"><a href=\"#cli-%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E5%90%AB%E3%82%80%E5%A4%9A%E6%95%B0%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%8C%E3%81%82%E3%82%8B\" aria-label=\"cli ツールを含む多数のプラグインがある permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CLI ツールを含む多数のプラグインがある</h3>\n<p><a href=\"https://asdf-vm.com/#/plugins-all\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">All Plugins</a> のページに書かれているように、asdf には非常にたくさんのプラグインがあります。\n特に kubectl や terraform のようにバージョンの違いでそこそこ変更がある CLI ツールを使っている場合は重宝します。</p>\n<h3 id=\"○○env-の設定ファイル-node-version-や-ruby-version-と互換性がある\" style=\"position:relative;\"><a href=\"#%E2%97%8B%E2%97%8Benv-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-node-version-%E3%82%84-ruby-version-%E3%81%A8%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8B\" aria-label=\"○○env の設定ファイル node version や ruby version と互換性がある permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>○○env の設定ファイル (.node-version や .ruby-version) と互換性がある</h3>\n<p>~/.asdfrc の設定により、.node-version や .ruby-version に記述されたバージョンを使うことが可能です。\nなので、すでに nodenv や rbenv などで管理されている場合でも asdf に切り替えるのは簡単です。</p>\n<h3 id=\"anyenv-がメンテナンスされていない\" style=\"position:relative;\"><a href=\"#anyenv-%E3%81%8C%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84\" aria-label=\"anyenv がメンテナンスされていない permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>anyenv がメンテナンスされていない</h3>\n<p>anyenv は 1 年以上メンテナンスされておらず、プルリクエストもオープンのまま放置されたりしています。\n対して、asdf は現在高頻度でメンテナンスされています。</p>\n<h2 id=\"docker-による開発構築との比較\" style=\"position:relative;\"><a href=\"#docker-%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA%E6%A7%8B%E7%AF%89%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83\" aria-label=\"docker による開発構築との比較 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Docker による開発構築との比較</h2>\n<p>最近では Docker (Docker Compose) を使って開発環境を用意することも多いです。</p>\n<p>Docker を使った開発環境を、asdf などをホストマシンで直接使った開発環境と比較すると、メリット・デメリットはおおよそ以下のようになると思います。</p>\n<ul>\n<li>\n<p>Docker を使った開発環境のメリット</p>\n<ul>\n<li><code class=\"language-text\">docker-compose up</code> だけで環境構築が完了するなど、環境構築で実行すべきコマンドが少ないため、チームに参加後すぐに開発を開始できる</li>\n<li>環境の差異がほとんどなくなるため、再現性が非常に高い</li>\n</ul>\n</li>\n<li>\n<p>Docker を使った開発環境のデメリット</p>\n<ul>\n<li>Docker の知識がないと困る場面が少なくない</li>\n<li>ちょっとしたことをしたいだけでもコンテナ上でコマンドを打つことになって面倒</li>\n<li>Docker for Mac のパフォーマンスが非常に悪い</li>\n</ul>\n</li>\n</ul>\n<p>再現性の高さは asdf や○○env でも十分な気もしますので、Docker を使う実質的なメリットは、初期構築コストの低さぐらいではないかと思います。</p>\n<p>そんなこともあり、個人的な使い分けとしては、開発する言語のランタイムは asdf で用意して、ローカルの DB などは Docker で用意することが多いです。\nローカルの DB の用意はホストに直接インストールするよりも Docker を使う方がほぼ確実に楽なので、そこは Docker を使いましょう。</p>\n<h2 id=\"asdf-導入時にエラーが発生したら\" style=\"position:relative;\"><a href=\"#asdf-%E5%B0%8E%E5%85%A5%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%82%89\" aria-label=\"asdf 導入時にエラーが発生したら permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>asdf 導入時にエラーが発生したら</h2>\n<p>最後に、asdf を導入しようとして遭遇したエラーについて書いておきます。</p>\n<p>私が asdf を試そうとした際、Node.js や Ruby などをインストールしようとして、システムの依存関係が不足していることによるエラーに遭遇しました。</p>\n<p>こういったエラーの対処方法は、そのプラグインの README をちゃんと読むことです。</p>\n<p><a href=\"https://github.com/asdf-vm/asdf-nodejs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">asdf-nodejs</a> であれば</p>\n<blockquote>\n<h2 id=\"requirements\" style=\"position:relative;\"><a href=\"#requirements\" aria-label=\"requirements permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Requirements</h2>\n<h3 id=\"macos\" style=\"position:relative;\"><a href=\"#macos\" aria-label=\"macos permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MacOS</h3>\n<ul>\n<li><a href=\"http://www.gnu.org/software/coreutils/coreutils.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GNU Core Utils</a> - <code class=\"language-text\">brew install coreutils</code></li>\n<li><a href=\"http://www.gnupg.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GnuPG</a> - <code class=\"language-text\">brew install gpg</code></li>\n</ul>\n</blockquote>\n<p><a href=\"https://github.com/asdf-vm/asdf-ruby\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">asdf-ruby</a> であれば</p>\n<blockquote>\n<p>Please make sure you have the required <a href=\"https://github.com/rbenv/ruby-build/wiki#suggested-build-environment\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">system dependencies</a> installed before trying to install Ruby.</p>\n</blockquote>\n<p>のように、プラグイン利用時に必要な依存関係について書かれています。\nこの依存関係は asdf で自動的にインストールされることはないので、brew や apt などでインストールしましょう。</p>\n<p>こういった依存関係の問題は rbenv などを使っていて遭遇したこともあるので、asdf に限った話ではないと思います。</p>\n<h2 id=\"参考\" style=\"position:relative;\"><a href=\"#%E5%8F%82%E8%80%83\" aria-label=\"参考 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>参考</h2>\n<p>Web</p>\n<ul>\n<li><a href=\"https://questbeat.hatenablog.jp/entry/2020/07/06/003357\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">anyenv から asdf に移行した</a></li>\n<li><a href=\"https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる</a></li>\n</ul>","fields":{"slug":"/posts/anyenv-asdf-docker","tagSlugs":["/tag/devops/"],"autoRecommendPosts":["docker-books","udemy-docker-from-linux-and-networking","best-way-to-setup-docker-volume","ecs-on-fargate-deployment-tools-ver-2022"]},"frontmatter":{"date":"2020-07-17T22:50:33.033Z","description":"複数のプログラミング言語の複数バージョンを管理するツールとして、anyenv や asdf が存在します。\nこの 2 つのツールを比較し、自分は今後 anyenv ではなく asdf を採用することに決めたので、その理由を解説します。\nまた、開発環境として一般的になってきている Docker を使う場合とも比較します。","tags":["devops"],"title":"anyenv vs asdf vs Docker で asdf を使う理由","socialImage":null,"recommendPosts":["https://www.kanzennirikaisita.com/posts/docker-books","https://www.kanzennirikaisita.com/posts/software-developer-books-index"]}}},"pageContext":{"slug":"/posts/anyenv-asdf-docker"}},"staticQueryHashes":["251939775","3942705351","401334301"]}