macOS（zsh）にてシステムワイドにasdfをインストール

こんにちは、たけるです^^。

皆さんは、スクリプト言語系開発環境のバージョンアップ管理ツール、何をお使いですか？
私は以前はanyenvを使っておりました。
最近、MacBook Proを購入したので、現在、新しいMacにて色々環境整備を行なっております。

色々調べていたら、今はanyenvよりもasdfの方がトレンドということ。
その理由として、現在のmacOSのデフォルトシェルはzshなのですが、そこでanyenvは動作が重い、ということが挙げられていました。

そこで、一度asdfを試してみようと思います。
今回は、asdfをシステムワイドにインストールいたします。
そのため、asdf本体のインストールにHomebrewは用いません。
Homebrewでインストールした場合、brewコマンドでバージョンを上げた時にディレクトリを追従しない問題があると目にしました。

ただし、必要なパッケージのインストールにはHomebrewを用います。

# インストール準備
まずは、必要なパッケージのインストール確認です。
以下のコマンドを実行します。
ここでは、Homebrewがインストールされていることが前提です。

~~~zsh
% brew install coreutils curl git
~~~

# asdf本体のインストール
gitを用いてcloneを実行します。
以下のコマンドを実行します。
ここでは、`/opt/local/asdf`にインストールいたします。

~~~zsh
sudo git clone https://github.com/asdf-vm/asdf.git /opt/local/asdf
~~~

次に、システムワイドにインストールしたため、権限を変更する必要があります。

まずは、OS側でasdfを使用するユーザのために"asdf"グループを作成します。

macOS Venturaの場合、左側ペインにて「ユーザとグループ」を選択し、表れた右側ペインにて「グループ」のところにある「アカウントを追加...」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/f41f6d6d-9108-8d66-0087-6d049879afd6.png)

ログインパスワードを訊かれますので入力します。

アカウントの作成ウィザードが表示されるので、「新規アカウント」のプルダウンメニューを「グループ」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/8b265a54-f247-e873-84b3-44ea1fd48041.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/d348ae35-1c89-dec5-4407-cb86fa155ae4.png)

グループ名に"asdf"と入力してグループを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/ebd5e95a-3100-5cd9-9288-498ab2174657.png)

グループ"asdf"が作成されたことを確認し、右側の"ⓘ"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/faf698b7-1871-018d-c89d-f11f9bba78ce.png)

asdfを使用するユーザをONにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/8f463f23-cabd-cdfb-2de0-39d7ff176b26.png)

これでasdfグループにユーザを所属させることができました。

次にasdfをインストールしたディレクトリについて、asdfグループに所属するユーザが使用できるように権限を変更します。
以下のコマンドを実行します。

~~~zsh
sudo chgrp -R asdf /opt/local/asdf
sudo chmod -R g+rwXs /opt/local/asdf
sudo chmod 2755 /opt/local/asdf
sudo chmod 2755 /opt/local/asdf/completions
~~~

さらに、plugin用のディレクトリを作成します。

~~~zsh
sudo mkdir /opt/local/asdf/plugins
sudo chmod 2775 /opt/local/asdf/plugins
~~~


次に、シェル起動時にasdfを使えるようにします。
しかしながら、zshでは、bashのように/etc/profile.d/の中を読みにはいきません。
そこで、読みに行くようにするために`/etc/zprofile`に以下を追記します。

~~~zsh:/etc/zprofile
追記:
for i in /etc/profile.d/*.sh ; do
    [ -r $i ] && source $i
done
~~~

これで`/etc/profile.d/`の中にあるファイルを実行しにいきます。

最後に、`/etc/profile.d/asdf.sh`ファイルを作成します。

~~~bash:/etc/profile.d/asdf.sh
新規作成:
export ASDF_DIR=/opt/local/asdf
export ASDF_DATA_DIR=$ASDF_DIR

ASDF_BIN="${ASDF_DIR}/bin"
ASDF_USER_SHIMS="${ASDF_DATA_DIR}/shims"
PATH="${ASDF_BIN}:${ASDF_USER_SHIMS}:${PATH}"

. "${ASDF_DIR}/lib/asdf.sh"
#. "${ASDF_DIR}/completions/asdf.bash"

# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit
~~~

ここまできたら、一度シェルを落として再度起動し、以下のコマンドが実行できるか確認しましょう。

~~~zsh
% asdf help
version: v0.11.2-8eb11b8

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"
-- Rajinikant
~~~

このように表示されればインストール完了です。

今回はインストールまでとさせていただきたく。
使い方などはまた別の機会にしますね。

# さいごに
いかがでしたか^^？

anyenvを使用していた私にとってはどれくらい使い勝手が変わるか楽しみです^^。
MacBook Proを購入したのを機にまたコーディング生活を送りたいと思っているので、活用していきたいと思います。

ではでは。
たけるでした^^。

# 参考文献
* [バージョン管理ツール「asdf」を使ってみる](https://dev.icare.jpn.com/dev_cat/how_to_use_asdf/)
* [zshでログイン・ログアウト時に実行されるファイル](https://qiita.com/yuku_t/items/40bcc63bb8ad94f083f1)
* [Ubuntu 20.04 に asdf をシステムワイドにインストールする](https://qiita.com/salty-byte/items/e6fe2bbc748dff15de34)
* [asdf-vm.com - Getting Started](https://asdf-vm.com/guide/getting-started.html)
* [zshでのasdfの補完設定](https://qiita.com/pei_1227/items/f47ac27e93848802e2ff)
* [macでzshでzsh compinit: insecure directoriesの警告が出る問題](https://qiita.com/ayihis@github/items/88f627b2566d6341a741)