【ruby/rust】バージョン管理をasdfにまとめる

2022年8月31日

こんにちは、しきゆらです。
今回は、だいぶ旬に乗り遅れた感がありますが、言語等のバージョン管理をasdfに乗り換えたので導入方法や使い方をメモしておきます。

導入の経緯

導入に経緯を一応書いておくと、私はPCの組み換えやOS不調等で、結構な頻度でクリーンインストールをします。
そのたびにRubyをインストールするためにrbenvを導入し、Nodeを使うためにnを導入し、ということを毎度行っていました。
この作業をあまり意識せずにやっていたのですが、先日ふと面倒だなと思うようになりました。
というのも、それぞれ年に数回程度の頻度でしかやらないので、毎度インストールするタイミングで調べて手順をなぞる、というのが知識にもならず無駄に時間がかかるだけなのでは、という風に思ってしまいました。
この辺を解決するツールはないのか、調べてみると、今回使った「asdf」というのがあるということを知ったので触ってみた、という感じです。


導入手順

では、asdfのインストール方法をメモしておきます。
なお、公式サイトの手順をなぞっています。
また、ここではWSL2上で動いているUbuntuに入れていきます。

# 依存パッケージを入れておく
sudo apt install curl git

# asdf本体を落としてくる
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2

# .zshrcに以下を追記
. $HOME/.asdf/asdf.sh

これにて導入は完了です。
asdfと実行して、ずらっと文言が出てくれば導入成功です。

> asdf
version: v0.10.2-7e7a1fa

MANAGE PLUGINS
asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
                                        add a Git repo as a plugin by
                                        specifying the name and repo url
asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
                                        git urls and git-ref
asdf plugin list all                    List plugins registered on asdf-plugins
                                        repository with URLs
asdf plugin remove <name>               Remove plugin and package versions
asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
                                        default branch or a particular git-ref
asdf plugin update --all                Update all plugins to latest commit on
                                        default branch


MANAGE PACKAGES
asdf install                            Install all the package versions listed
                                        in the .tool-versions file
asdf install <name>                     Install one tool at the version
                                        specified in the .tool-versions file
asdf install <name> <version>           Install a specific version of a package
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
asdf uninstall <name> <version>         Remove a specific version of a package
asdf current                            Display current version set or being
                                        used for all packages
asdf current <name>                     Display current version set or being
                                        used for package
asdf where <name> [<version>]           Display install path for an installed
                                        or current version
asdf which <command>                    Display the path to an executable
asdf local <name> <version>             Set the package local version
asdf local <name> latest[:<version>]    Set the package local version to the
                                        latest provided version
asdf global <name> <version>            Set the package global version
asdf global <name> latest[:<version>]   Set the package global version to the
                                        latest provided version
asdf shell <name> <version>             Set the package version to
                                        `ASDF_${LANG}_VERSION` in the current shell
asdf latest <name> [<version>]          Show latest stable version of a package
asdf latest --all                       Show latest stable version of all the
                                        packages and if they are installed
asdf list <name> [version]              List installed versions of a package and
                                        optionally filter the versions
asdf list all <name> [<version>]        List all versions of a package and
                                        optionally filter the returned versions
asdf help <name> [<version>]            Output documentation for plugin and tool


UTILS
asdf exec <command> [args...]           Executes the command shim for current version
asdf env <command> [util]               Runs util (default: `env`) inside the
                                        environment used for command shim execution.
asdf info                               Print OS, Shell and ASDF debug information.
asdf reshim <name> <version>            Recreate shims for version of a package
asdf shim-versions <command>            List the plugins and versions that
                                        provide a command
asdf update                             Update asdf to the latest stable release
asdf update --head                      Update asdf to the latest on the master branch

RESOURCES
GitHub: https://github.com/asdf-vm/asdf
Docs:   https://asdf-vm.com

"Late but latest"
-- Rajinikanth

必要な言語をインストールしてみる

ここでは、よく使うRubyとちょっと触っているRustをインストールしていきます。

asdfは、それぞれ言語ごとにプラグインを追加していく方式になっています。
なので、まずはプラグインを導入していきます。
なお、追加できるプラグインの一覧はこちらのコマンドで確認できます。

asdf plugin list all

プラグインを追加するにはasdf pluigin add rubyという感じで言語ごとにプラグインを入れていきます。

# 言語ごとのプラグインを追加
asdf plugin add ruby
asdf plugin add rust

# インストールできるバージョン等を確認
asdf list all ruby 
asdf list all rust

# インストールする
asdf install ruby 3.1.2
asdf install rust 1.62.1

# システム全体で使うバージョンを指定する
asdf global ruby 3.1.2
asdf global rust 1.62.1

# 部分的に使うバージョンを指定する
asdf local ruby 2.7.6 # ここではインストールしていないが、カレントディレクトリ以下で使うバージョンを指定できる

# バージョンを表示してみる
ruby -v
# => ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
rustc --version
# rustc 1.62.1 (e092d0b6b 2022-07-16)

こんな感じで、asdf一つで複数言語のバージョンを管理することができるようになりました。
コマンドを覚えるのがちょっと面倒ですが、asdf一つでよいので環境構築しなおすことが多いので手軽に環境を戻せるようになりました。
とても便利でよい。

まとめ

今回は、asdfというツールを使って実行環境のバージョン管理を一元管理するようにしてみました。
1つのツールの使い方を覚えれば、複数の言語の導入やバージョン管理をいい感じにできるようになりとても便利です。

さて、今回はここまで。
おわり