プロジェクト毎に異なるバージョンの言語処理系やツールを管理するために、pyenv や nodenv など *env の利用はほとんど必須となっている。 これらはほとんど一貫したコマンド体系を提供しており、同じ要領で様々な環境構築ができる非常に便利なソフトウェアだが、それを使うことで別の問題が出てくる: *env 自身の管理である。 無数の *env をインストールし、シェルを設定し、場合によりプラグインを導入し、アップデートに追従するのは非常に面倒な作業だ。
幸いなことにこれをワンストップで解決してくれるソリューションとして anyenv がある。これは各種 *env のパッケージマネージャというべきもので、一度 anyenv をインストールすれば複数の *env を簡単にインストールして利用できる。さらに anyenv-update プラグインを導入すればアップデートまでコマンド一発で完了する。素晴らしい。
そういうわけでもう長いこと anyenv を使ってきた。それで十分だった。
——のだが、
ここにもう一つ、対抗馬となるツールがある。asdf である。anyenv に対する asdf の優位性は大きく2つある: 一貫性と多様性だ。
一貫性
“Manage multiple runtime versions with a single CLI tool” という触れ込み通り、asdf は様々な言語やツールの管理について一貫したインタフェースを提供している。対して anyenv は *env をインストールするのみで、各 *env はそれぞれ個別のインタフェースを持っている。 基本的なコマンド体系は元祖である rbenv から大きく外れないにしても、例えば jenv のように単体で処理系を導入する機能を持たないものもある。それらの差異はユーザが把握し対応する必要がある。
多様性
asdf はプラグインシステムを持っている。というより asdf 本体はインタフェースを規定するだけで、環境構築の実務はすべてプラグイン任せである。 そのプラグインの数は本稿を書いている時点でおよそ 300 を数える。これは言語処理系ばかりでなく jq などのユーティリティや MySQL のようなミドルウェアも含むが、いずれにしても膨大なツールが asdf を使えば簡単に利用できるのである。
実のところ anyenv もマニフェストファイルを追加することで対応する *env を増やすことができる構造になっている (cf. anyenv-install)。しかし現在でも公式に対応しているのは 19 種で、他に大規模な野良リポジトリがあるという話も聞かない。
インストール
もはや asdf を導入しない理由はないということで、早速インストールしてみる。公式サイトのドキュメントが実に充実しているのでそれに沿って進めれば良い。
事前に必要な依存関係は GNU Coreutils / Curl / Git である。macOS なら Coreutils 以外は最初から入っているだろう。
~/.asdf にリポジトリをチェックアウトする:
% git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.0
そして .zshrc に以下の設定を加える (zsh の場合):
source $HOME/.asdf/asdf.sh
# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit
compinit
設定を反映させた新しいシェルを起動すれば完了である:
% exec zsh -l
使い方
まずプラグインの一覧から利用したいものを探す。例えば Java を導入したければ:
% asdf plugin list-all | grep -i java
java *https://github.com/halcyon/asdf-java.git
と名前が分かるので、
% asdf plugin add java
で java プラグインをインストールする。
次に利用可能な JDK を見ると:
% asdf list-all java
adoptopenjdk-8.0.181+13
adoptopenjdk-8.0.192+12
adoptopenjdk-8.0.202+8
adoptopenjdk-8.0.202+8.openj9-0.12.0
adoptopenjdk-8.0.202+8.openj9-0.12.1
...
zulu-javafx-14.29.23
zulu-javafx-15.27.17
zulu-javafx-15.28.13
zulu-javafx-15.28.51
zulu-javafx-15.29.15
というように長大なリストが出てくるので、使いたいものを選んでインストールする:
% asdf install java adoptopenjdk-11.0.10+9
これで AdoptOpenJDK がインストールされた。次にどの環境で使うかだが、とりあえずデフォルトにしておきたい場合は global で指定すれば良い:
% asdf global java adoptopenjdk-11.0.10+9
*env と同様、対話している現在のシェル内のみ切り替える asdf shell
や特定ディレクトリ以下でのみ切り替える adsf local
もある。
コメント
コメントを投稿