みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

asdf latest でLatest Stable Versionを取り扱う

kokuraexラジオhttps://fukuokaex.connpass.com/event/245562/Twitterスペースで聴いた話。

asdfで、Stable Version を扱う「latest」コマンドが追加されているとのこと。*1

少し気になったので、ちょっと試してみた。

備忘録として記録しておきます。

概要

asdf latest」コマンドは、asdfのplug-inでインストールした各言語の「Latest Stable Version(最新の安定版)」がどのバージョンか確認するためのコマンドです。

https://asdf-vm.com/manage/versions.html#show-latest-stable-version

ヘルプを見ると、以下のように書かれてました。

asdf latest <name> [<version>]          Show latest stable version of a package


特定の言語名(=パッケージ名)を指定すると、その言語の最新の安定版のバージョンを教えてくれます。

例えば、2022/04/29の現時点(以降、「現時点」と表記)で、「elixir」を指定してasdf latestを実行してみます。
すると、「1.13.4-otp-24」を返してきました。

$asdf latest elixir
1.13.4-otp-24


また、言語名と一緒にバージョンを指定すると、そのバージョンの最新の安定版を返してくれます。
現時点のelixirの最新の安定バージョンは1.13ですから、こちらを指定して試してみます。
すると、バージョン指定なし時と同じように、「1.13.4-otp-24」を返してきました。
では、メジャーバージョンのみでは?
こちらのケースでも、やはり「1.13.4-otp-24」を返してきました。

$asdf latest elixir 1.13
1.13.4-otp-24

$asdf latest elixir 1
1.13.4-otp-24

それでは、elixirの一つ前のバージョン「1.12」を指定して試してみます。
すると、v1.12での最新「1.12.3-otp-24」を返してくれました。

$asdf latest elixir 1.12
1.12.3-otp-24
allオプション

asdf latest」コマンドには、「--all」オプションがあります。
--all」をつけて実行すると、インストールされている全ての言語を対象にして、最新の安定版がインストールされているか*2がチェックされます。


ヘルプでは、以下のように書かれています。

asdf latest --all   Show latest stable version of all the packages and if they are installed


私の環境では、「elixir」「erlang」「gleam」「nodejs」「rebar」「ruby」をasdfでインストールしています。そのため、以下のように各言語のバージョンが表示されていました。
gleamとrebarについては最新の安定版が、それ以外については安定版がインストールされていないと表示されました。
elixirについては、上記でみてきたバージョンとは違った名称(main-otp-24)で書かれています。
現時点では「main=1.13.4」なので、実質的に同じもののはずですが、扱いは別物のようです。(後述のインストールの項目を参照)

$asdf latest --all
elixir	main-otp-24	missing
erlang	24.3.3	missing
gleam	0.21.0	installed
nodejs	lts	missing
rebar	3.18.0	installed
ruby	truffleruby+graalvm-22.0.0.2	missing
$

最新の安定版のインストール

asdf install時に「latest」を指定することで、「Latest Stable Version」をインストールできます。

https://asdf-vm.com/manage/versions.html#install-latest-stable-version

ヘルプには、以下のように記載されています。

asdf install <name> latest[:<version>]  Install the latest stable version of a
                                        package, or with optional version,
                                        install the latest stable version that
                                        begins with the given string

DeepL本訳:

パッケージの最新の安定版をインストールします。
パッケージ,あるいはオプションのバージョンで始まる最新の安定版をインストールします。

では、バージョン指定して、latestをインストールしてみます。
私の環境だと、ちょうどelixirの最新安定版である「1.13.4-otp-24」がインストールされていないので、これが入るように、versionを1.13に指定して実行してみます。

まず、今の私の環境にインストールされているのは以下。
最新の「1.13.4-otp-24」はインストールされていません。

$asdf list elixir 1.13
  1.13.1-otp-24
  1.13.3-otp-24


「latest:1.13」を指定して、asdf installを実行。

$asdf install elixir latest:1.13
==> Checking whether specified Elixir release exists...
==> Downloading 1.13.4-otp-24 to /Users/pathto/.asdf/downloads/elixir/1.13.4-otp-24/elixir-precompiled-1.13.4-otp-24.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6237k  100 6237k    0     0   349k      0  0:00:17  0:00:17 --:--:--  422k
==> Copying release into place

再確認してみると、最新の「1.13.4-otp-24」が、インストールされていました。

$asdf list elixir 1.13
  1.13.1-otp-24
  1.13.3-otp-24
  1.13.4-otp-24

ちょっと気になって、「asdf latest --all」を実行してみました。
すると...

$asdf latest --all
elixir	main-otp-24	missing
〜(以下略)〜

...おや?
「main-otp-24」と「1.13.4-otp-24」は違うもの扱いのようです。

まとめ

asdfでインストールする際には、原則特定のバージョンを明示してインストールすることが多いので、インストールでは使うことがなさそうだなとは思いました。
反面、バージョン指定をしたくないなら、こちらで利用するのもありかも。

*1:正確には、v0.9.0の頃にはすでにあって、2022年4月28日時点の最新版v0.10.0で「--all」オプションが追加されたとのこと。

*2:インストールされているかどうかのチェックだけです。当該ディレクトリ上で利用しているかどうかはチェックされません