ubuntu(20.04 LTS)でasdfを使う

asdfというのは開発環境(nodeやrubyやpostgresqlなど)のバージョンを容易に管理するツール。
脱Microsoftな開発者でWeb開発を行う人は知っておいて損はないツール。
当サイトではrubyをインストールするまでを記録として残します。

asdfのセットアップ

公式はこちら。何も考えずにインストールしたい人は以下。

sudo apt install curl git

以下は2. Download asdfの項目を参照すること。

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.9.0

次はインストール。といってもターミナルの起動時に実行される設定ファイルにコマンドを追記するだけ。
ubuntu(20.04 LTS)の場合は「Bash&Git」を参照。

echo ". $HOME/.asdf/asdf.sh" >> ~/.bashrc
echo ". $HOME/.asdf/completions/asdf.bash" >> ~/.bashrc

インストールの確認には以下のコマンドを実行。

asdf --version

「v0.9.0-9ee24a3」のように表示されれば成功。

asdfはバージョン管理したい開発環境のためのプラグインを導入して活用するツール。
最初に記載したように当サイトではrubyを使いたいのでrubyをインストールします。

asdfでrubyを使うための準備

asdfのrubyプラグインを導入します。
ただし、先に system dependencies (システムの依存関係) を解消しろ。とのこと。

sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev

続いて、asdfのrubyプラグインのセットアップ。

asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git

以上で、準備は完了。準備が完了したかどうかを確認する場合は以下のコマンド

 asdf list-all ruby

(2022/03/27 時点では以下のようなリストが表示されるので、3.0.3とか3.1.1が最新を求めるなら有力な候補、といってもバージョンは開発環境に合わせたバージョンを選択してください。)

...
3.0.0-rc1
3.0.0
3.0.1
3.0.2
3.0.3
3.1.0-dev
3.1.0-preview1
3.1.0
3.1.1
3.2.0-dev
...

asdf管理下にrubyをインストール

当サイトで必要なバージョンは「2.5」になります。
一言で2.5といっても以下の種類が存在します。
(ホントは3.1.1を使いたいがサーバが対応していないので断念)

2.5.0-dev
2.5.0-preview1
2.5.0-rc1
2.5.0
2.5.1
2.5.2
2.5.3
2.5.4
2.5.5
2.5.6
2.5.7
2.5.8
2.5.9

公式を参考にこの中で最も新しい「2.5.9」をインストールすることにしました。

準備が多少面倒(と言っても慣れれば一瞬ですが)だっただけあり、ここからは超簡単。
以下のコマンドを実行するだけ。

asdf install ruby 2.5.9

しばらく待つとインストールが完了する。
インストールが完了したかどうかは以下のコマンドで確認する。

asdf list
ruby
  2.5.9

のように表示されていれば成功。

asdfの考え方

asdfではlocal(カレントディレクトリ以下に適用)とglobal(localで指定がないディレクトリに適用)の2種類のバージョン指定が可能。

開発環境が1つしかないような環境であればglobalだけ意識していればいい。
しかし、複数の開発環境を切り替えて使うような場合は、所定のバージョンを使いたいディレクトリをカレントに指定して、localのバージョン指定を行うことになる。

localのバージョン指定を行うと「.tool_versions」というファイルが作られるが、このファイルをgitに含めてコミットしておくと、同じようにasdfでバージョン管理している共同開発者の環境で同じバージョンを使った開発が容易に可能になる。

文章で書かれてもなにそれ?という状態だと思うので実例で書きます。

develop_directory
|- dev1
|  |- src
|     |- test1.rc  (ruby 2.5.9で開発)
|
|- dev2
   |- src
      |- test2.rc  (ruby 3.1.1で開発)

上記のようにdev1(test1.rc)とdev2(test2.rc)で異なるバージョンのrubyで開発をしたい場合を例にする。

当サイトでは「2.5.9」のインストールは済ませているので、「3.1.1」とasdfについてわかりやすいように「3.0.3」をインストールして、「3.0.3」をglobalとして設定するところから説明を始めます。
インストールは超簡単、どこのディレクトリがカレントでも構わないので以下を実行する。

asdf install ruby 3.0.3
asdf install ruby 3.1.1

インストールが完了したかどうかを確認するために以下を実行

asdf list
ruby
  2.5.9

  3.0.3
  3.1.1

のように表示されるはず。

では、次はお試し用のディレクトリを作成。

mkdir -p develop_directory/dev1/src
mkdir -p develop_directory/dev2/src

まずは、デフォルトで(globalに)設定されているrubyについて確認する。

ruby -v
No version is set for command ruby
Consider adding one of the following versions in your config file at 
ruby 2.5.9
ruby 3.0.3
ruby 3.1.1

すると、上記のようにセットされていないよ。と怒られるので、まずはデフォルト(global)で3.0.3を選択するための指定をasdfに対して行う。

asdf global ruby 3.0.3

再度「ruby -v」を実行してみると

ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux]

のような結果を得られるはずである。

続いて、それぞれのディレクトリでバージョンを確認してみます。

cd develop_directory/dev1/
ruby -v
cd ../../develop_directory/dev2/
ruby -v
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux]

全ての「ruby -v」の結果が上記になる。

ではd「dev1」に「2.5.9」、「dev2」に「3.1.1」を設定します。

cd ../../develop_directory/dev1/
asdf local ruby 2.5.9
ruby -v
ruby 2.5.9p229 (2021-04-05 revision 67939) [x86_64-linux]

のような結果になれば成功。

「dev2」も同じように以下を実行し…

cd ../../develop_directory/dev2/
asdf local ruby 3.1.1
ruby -v
ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux]

のような結果になれば成功。

これで当初の目的のように「dev1」をruby 2.5.9の開発環境にし、「dev2」をruby 3.1.1の開発環境にすることができました。

最初にいったように使用している環境の情報は「.tool-versions」のファイルに書き込まれるので..

ls- al
cat .tool-versions
# 以下は ls -al の結果
drwxrwxr-x 3 group user_name 4096  3月 27 19:20 .
drwxrwxr-x 4 group user_name 4096  3月 27 18:02 ..
-rw-rw-r-- 1 group user_name   11  3月 27 19:20 .tool-versions
drwxrwxr-x 2 group user_name 4096  3月 27 18:02 src

# 以下はcatの結果
ruby 3.1.1

のような結果が確認できる。
この「.tool-versions」をgitにコミットしておけば、共同開発者ごとに環境が異なってトラブルになることもなくなる。

まだ、いまいち理解できていなければ、改めてdev1をカレントディレクトリに変更してrubyのバージョンを確認してみる。

cd ../../develop_directory/dev1/
ruby -v
ruby 2.5.9p229 (2021-04-05 revision 67939) [x86_64-linux]

という結果を得ることができるので、ディレクトリ毎に異なるバージョンのrubyが使われていることが確認できるはずである。