ちょっと話題の記事

anyenv のススメ

anyenv を使ってプログラミング言語のバージョンを簡単に管理しよう
2020.05.05

anyenv は以前、西村が紹介していましたが、これは現時点の最新情報とあわせてのアップデート記事です。

Tech Lead のお仕事紹介の第 4 弾にあたります。

追記: asdf について

はてなブックマークで asdf というツールを教えていただきました。シングルバイナリーで動作し、プロジェクトに必要な依存バージョンを .tool-versions というファイルひとつで共有可能なものです。

とりあえず試してみようとしたのですが、まだインストールに難があるようで手元で動きませんでした。もう少し安定したらとても良い選択肢となりそうなので注目しています。現時点での選択可能な手段としては anyenv が良いでしょう。

contributer の方にサポートしてもらってインストールができたので試してみました。チームがメインで使っている Node.js のサポートがもう一歩なこと、グローバルインストールするツールは使わないため旨味があまりないことがわかったので改めて anyenv を採用することにしました。

教えていただいた方々、ありがとうございました。

anyenv とは

公式サイトは GitHub repository です。

https://github.com/anyenv/anyenv

プログラミング言語はバージョンによってサポートする機能が異なります。バージョンを上げることによって以前まで許容されていた書き方ができなくなったり、開発者にうれしい機能が追加されることがあります。

また、プロジェクトによって現在使用しているバージョンが異なるという状況も容易に発生します。こういった場合、同一言語でも複数バージョンをインストールしておく必要がありますが、標準ツールとしてサポートしている言語、サードパーティーでそういったツールが用意されている言語、複数バージョンをインストール不可能な言語など、ばらつきがありました。

一時期 Docker などコンテナー技術を用いて開発環境を作成するなどで回避されていましたが、オーバーヘッドが大きくメンバーごとのカスタマイズがしづらい難点がありました。

anyenv は現在使われている主要な言語をサポートし、複数のバージョンをインストール、管理可能なツールです。一元的な管理が可能なだけでなく、たいていの言語のバージョンコントロールも可能なため、使用したいツールの依存を解決しやすくなるという利点も持っています。さらに、あるディレクトリー以下で特定のバージョンを用いる、という設定も可能なため、最初に適切に設定しておくことでプロジェクト間のバージョンの違いを意識せずともよくなります。

インストール

macOS であれば Homebrew が使用可能です。

brew install anyenv
anyenv init

その他の OS では Git repository の clone と設定が必要です。公式の手順を参照してください。

各言語の設定

よく使われるであろう言語の設定例をまとめます。

Node.js

インストール

以前は nenvndenv というコマンドが提供されていましたが既にメンテナンスされていないという理由で nodenv サポートへ切り替わりました

Node.js 製のツールが多いため、入れておくと何かと便利です。

nodenv をインストールしましょう。

anyenv install nodenv

最近の Node.js は非常に安定していますが、プロジェクトで使用するバージョンは LTS: Long Term Support の最新版とするとよいでしょう。リリーススケジュールメーリングリストで LTS バージョンのリリース時期を把握し、適切なバージョンを選択しましょう。ちなみに LTS はメジャーバージョンが偶数のものです。

インストール可能なバージョンは install サブコマンドに -l もしくは --list オプションを付与することで確認可能です。

nodenv install --list

が、 io.js も含めたすべてのバージョンが表示されるため、見づらいでしょう。最近のものだけ表示するために、 grep で正規表現を用いて絞り込むと良いでしょう。次はメジャーバージョン 10 以上のものだけ表示しています。

nodenv install -l | grep -E '^1\d'

現在 LTS であるバージョン 12 系の最新をインストールしたい場合は次のコマンドを実行しましょう。

nodenv install $(nodenv install -l | grep -E '^12' | grep -v dev | tail -1)

設定

普段使うバージョンは global サブコマンドで指定します。

基本的にインストールしたすべてのバージョンのうち、最新を使うこととしましょう。

nodenv global 12.16.3

バージョン指定が面倒くさい場合は次を実行しましょう。

nodenv global $(nodenv versions | tail -1 | tr '*' ' ' | awk '{print $1}')

各プロジェクトで使うバージョンを指定するには local サブコマンドを使いましょう。

nodenv local 12.16.1

local サブコマンドを実行すると、現在のディレクトリー直下に .node-version ファイルが生成されます。中身はバージョンが書かれているだけですが、 nodenv がインストールされているマシンではこのファイルを参照して、自動的に使用するバージョンを切り替えてくれます。メンバーと設定を共有するため、 Git 管理化におくと良いでしょう。

メンバーが指定したバージョンをインストールしていない場合、 node コマンドの実行時に次のようなメッセージが出力されます。この場合は該当バージョンを適宜インストールしましょう。

nodenv: version `10.16.3' is not installed (set by /Users/takagi.kensuke/work/dev/experiments/node/fix-version/.node-version)

Ruby

Ruby は様々なツールで使われているため、これも anyenv で管理してしまいましょう。ただし、使い方は nodenv と同様です。

anyenv install rbenv
rbenv install $(rbenv install -l | grep -E '^2' | grep -v dev | tail -1)
rbenv global $(rbenv versions | tail -1 | tr '*' ' ' | awk '{print $1}')
gem install bundler

現在の rbenv は rehash サブコマンドを実行する必要がないため、これで初期設定完了です。

各プロジェクトで local サブコマンドを使い、使用する ruby バージョンを固定してください。 .ruby-version ファイルが生成されますので、 Git 管理に追加しましょう。

Python

Python も便利なツールの依存となっていることが多い言語です。基本は nodenv / rbenv と同様ですが、野村がpyenv + virtualenv での環境構築について詳しくまとめていますので参照してください。

まとめ

とても簡単に複数のバージョンを管理可能なツールです。各メンバーがインストールしているとチームとしての開発効率も上がります。ぜひ有効活用しましょう。