
いろんなツールのバージョンマネージャの asdf は、個人が占有するPCでユーザーのホームディレクトリにインストールして使うもの。
WindowsやmacOSは個人が占有して使うことが多い気がするけど、Linuxは複数ユーザーで使うこともある。
ユーザー毎にホームディレクトリにインストールするのもなんだかなーと思ったので、全ユーザー用にシステムワイドにasdfを使う方法を考えてみた。
確認のために用意した環境
Debian 12を最小セットアップしたマシン
asdfを全ユーザー用にインストール
- 必要なパッケージを追加
$ sudo apt update $ sudo apt install curl git acl
- 同じ名前のファイルが無いことを確認。
$ ls -l /usr/local/bin/asdf ls: '/usr/local/bin/asdf' にアクセスできません: そのようなファイルやディレクトリはありません
- asdfインストール
asdfはv0.16.0でGoで書き直されてバイナリファイルが1つだけなので、https://github.com/asdf-vm/asdf/releases から自分のOS、アーキテクチャのファイルをダウンロードして展開するだけ。
AMD64のv0.18.0の例:$ curl -OL https://github.com/asdf-vm/asdf/releases/download/v0.18.0/asdf-v0.18.0-linux-amd64.tar.gz $ sudo tar xzf ~/asdf-*.tar.gz -C /usr/local/bin $ $ asdf version v0.18.0 (revision 2114f1e)
- asdf設定
- asdf用の各種プラグインのインストール先ディレクトリ作成
あるグループに属するユーザーは全員読み書きしたいのでSGIDビットを立てる$ sudo mkdir -m 2775 /opt/asdf
- ここではグループをadmにするけど、もちろん新規に専用グループを作っても構わない
$ sudo chgrp adm /opt/asdf
- 新規作成されるファイルやディレクトリは、admグループが読み書きできるようにしたい
umaskでは実現できないのでACLを使う$ sudo setfacl -d -m g:adm:rwx /opt/asdf
- 全ユーザー用に環境変数をセットする
/etc/profile.d/asdf.sh を新規作成する、中身はこんな感じexport ASDF_DATA_DIR="/opt/asdf" export PATH="$ASDF_DATA_DIR/shims:$PATH"
- asdf用の各種プラグインのインストール先ディレクトリ作成
- /etc/bash.bashrc に以下を追記してasdf コマンドを上書きする
asdf install
中に実行されるtar
やinstall
コマンドはACLを無視するようで、グループの書き込み権が落ちてしまう。asdf install
実行後にsetfacl
で再度書き込み権を付与する。asdf() { if [ "$1" = "install" ]; then echo "'sudo setfacl' の実行権限を確認..." if sudo -l setfacl >/dev/null 2>&1; then echo "'asdf install' を実行します。" command asdf "$@" local exit_code=$? if [ $exit_code -eq 0 ]; then local plugin_name=$2 local version=$3 if [ -n "$plugin_name" ] && [ -n "$version" ]; then local install_path install_path=$(command asdf where "$plugin_name" "$version") if [ -d "$install_path" ]; then echo "グループに書き込み権を付与します。" sudo setfacl -R -m mask::rwx "$install_path" fi fi fi return $exit_code else echo "" echo "------------------------------------------------------------------" echo "エラー: このユーザーには 'sudo setfacl' を実行する権限がありません。" echo " 'asdf install' を実行できませんでした。" echo "------------------------------------------------------------------" return 1 fi else command asdf "$@" fi }
- SSHを入り直すか、
exec $SHELL -l
でシェルを読み直す
あとは公式ドキュメントのとおりに各種プラグインを入れていけばいい。asdf set HOGE latest
等でそれぞれのプラグイン毎にインストールしたバージョンを指定するのはユーザー毎に実施する。