📑

[2023年2月版]WSL Ubuntu 20.02 に asdf をインストールして動かしてみる

2023/02/18に公開

asdf とは

プラグインスタイルの **env ツールです。nodejsやjava、Python などの開発ツールのバージョン管理が容易に行えるようになります。
これまでそれぞれ rubyenv や nvm、sdkman などばらばらに入れていた開発環境管理ツールを asdf で集約できるらしいです。
さっそく入れてみます!

asdf のインストール

依存モジュール

メインの asdf コマンドの依存モジュールは以下の2つ

  • Git
  • Curl

これはインストール済みだったので飛ばします。

ダウンロード

以下のページを参考にダウンロード、というかリポジトリをクローンします。

https://asdf-vm.com/guide/getting-started.html#_1-install-dependencies

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

でサクッとダウンロード(クローン)完了。

Bash & Git の項目を参照して bash.rc に追記

. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"

で、とりあえず source します。

source ~/.bashrc

さっそく asdf 打ち込んでみますと

$ asdf
version: v0.11.1-27c8a10

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 current                            Display current version set or being
                                        used for all packages
asdf current <name>                     Display current version set or being
                                        used for package
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 help <name> [<version>]            Output documentation for plugin and tool
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 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 local <name> <version>             Set the package local version
asdf local <name> latest[:<version>]    Set the package local version to the
                                        latest provided version
asdf shell <name> <version>             Set the package version to
                                        `ASDF_${LANG}_VERSION` in the current shell
asdf uninstall <name> <version>         Remove a specific version of a package
asdf where <name> [<version>]           Display install path for an installed
                                        or current version
asdf which <command>                    Display the path to an executable


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

Node.js の環境をインストールしてみます。

それぞれのプラグインには依存モジュールがあるらしく、node.js プラグイン用にいくつかパッケージを追加します。

$ sudo apt-get install dirmngr gpg curl gawk
...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
gawk is already the newest version (1:5.1.0-1build3).
gawk set to manually installed.
curl is already the newest version (7.81.0-1ubuntu1.7).
dirmngr is already the newest version (2.2.27-3ubuntu2.1).
dirmngr set to manually installed.
gpg is already the newest version (2.2.27-3ubuntu2.1).
gpg set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 70 not upgraded.

とはいえ、インストール済みでしたのでそのままで動くようです。

ではさっそく asdf の node.js プラグインを追加してみます。

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

Node.js バージョンの確認

$ asdf list all nodejs
...
19.2.0
19.3.0
19.4.0
19.5.0
lts-argon
lts-boron
lts-carbon
lts-dubnium
lts-erbium
lts-fermium
lts-gallium
lts-hydrogen
lts

lts などの指定も可能ですね。

14 だけをリストアップしたい場合は以下のようにします。

$ asdf list all nodejs 14
...
14.19.1
14.19.2
14.19.3
14.20.0
14.20.1
14.21.0
14.21.1
14.21.2

lts をインストールしてみます。

$ asdf install nodejs lts
nstalling alias lts as 18.13.0
Trying to update node-build... ok
Downloading node-v18.13.0-linux-x64.tar.gz...
-> https://nodejs.org/dist/v18.13.0/node-v18.13.0-linux-x64.tar.gz
Installing node-v18.13.0-linux-x64...
Installed node-v18.13.0-linux-x64 to /home/xxxxxxxx/.asdf/installs/nodejs/18.13.0

Linking "lts" to "18.13.0"

asdf は Global と Local、実行中のシェルでバージョンの保存が別々にできます。
例えばカレントディレクトリで上記でインストールした LTS を有効にしてみて・・・

$ asdf current
nodejs          lts             /home/xxxxxxx/xxxxxx/asdf-example/.tool-versions
$ node -v
v18.13.0
$ cd ..
$ asdf current
nodejs          ______          No version is set. Run "asdf <global|shell|local> nodejs <version>"

一つ上のディレクトリに行ったらさっきの設定は忘れていて、<global|shell|local> で nodejs のバージョン指定してくださいとのメッセージが出る。
このようにディレクトリごとにバージョンを個別に指定することが可能です。

どのようになっているのかというと・・・

$ asdf local nodejs lts

とした時点で、 .tool-versions ファイルが生成されてます。
このファイルの中身は以下のような感じ。

nodejs lts

ツールごとにバージョンが記載される模様ですね。

そしてasdfの真骨頂。
別のディレクトリから移動してきても、勝手に元のバージョンが有効になってます!

$ cd ..
$ node -v
v16.19.1
$ cd asdf_example/
$ node -v
v18.13.0

例えば上のディレクトリで v16 を使っていても、v18 を有効にしたディレクトリに戻ってくると自動的にバージョンが切り替わってます。
すごい賢い!

開発環境でのツールのバージョン管理がぐっと楽になりますね~👍

本日は以上です。

Discussion