- 2023.1.12 変更点
~/.zshrc
の記述に誤りがあったので修正しました。
はじめまして。アプリケーションサービス部 DS2課の松尾です。
当部の案件では主に anyenv
を使って各自の開発環境のバージョンを揃えているのですが、「こんなのもあるよ」ということで asdfというツールをご紹介していきます。
asdfとは
開発言語(Python、Node.jsなど)や開発ツール(AWS CLI, AWS SAM CLI, Terraform など)のバージョンを管理できるコマンドラインツールです。
anyenv と比較すると、以下の点がポイントかな、と思います。
- コマンドに一貫性がある
- 全てのコマンドが
asdf
に集約されているので、「Pythonはpyenv
」「node.jsはnodenv
」という様に言語別に使い方を覚える手間が少ない
- 全てのコマンドが
- カバーされているプラグイン(= 言語・ツール)が多い
- プラグインを追加することで様々な言語やツールを追加できます
- 本記事記載時点で500以上のプラグインが存在します
- AWS CLI や Terraformのバージョンも管理できます
- プロジェクト内に複数の言語があっても*-versionだらけにならない
- shellログイン時のロードが早い(らしいです、未確認)
インストール
公式の手順 がわかりやすいので、基本はその通りに進めればOKです。
参考として、Amazon Linuxかつzsh環境でGitHubからインストールする場合の例を記載しておきます。
なお、zshの導入は↓の記事を参考にしました(行武さんありがとうございます)。
Git リポジトリのクローン
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
実行すると You are in 'detached HEAD' state. (以下省略)
と警告が出てきますが、今回の作業に支障はないのでスルーして先に行きます。
shellの設定
~/.zshrc
を編集して、shellログイン時にasdfが使用できるようにします。
vi ~/.zshrc
以下の内容を~/.zshrc
の最下行に追記します。
# asdfを有効化する
. $HOME/.asdf/asdf.sh
# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit
source ~/.zshrc
または再ログインして、動作確認します。
asdf --version
v0.10.2-7e7a1fa
よく使うコマンドの説明
インストール可能なプラグイン(= 言語・ツール)の一覧を表示する
asdf plugin-list-all
ちなみに、追加できるプラグインはGitHubでも確認できるようです。
プラグインをインストールする
初めてそのプラグインを使うときは、以下のコマンドを実行します。
asdf plugin add <プラグイン名>
各プラグインの操作
インストール済みのバージョンの確認
asdf list <プラグイン名>
インストール可能なバージョンの確認
asdf list all <プラグイン名> <バージョン(省略可)>
バージョンを指定してインストール
特定の言語バージョンをインストールするには、以下を実行します。
特定の言語バージョンを新規追加する
asdf install <プラグイン名> <バージョン>
.tool-versions
に記載されたバージョンをインストールする
実行ディレクトリに.tool-versions
ファイルを作成し、各言語のバージョンを記載しておくと、以下のコマンドで一括インストールしてくれます。
asdf install
バージョンの有効化
shell全体(グローバル)に有効化する
asdf global <プラグイン名> <バージョン>
特定のディレクトリ配下のみ有効化する
cd <適用したいディレクトリ> asdf local <プラグイン名> <バージョン>
reshim コマンド
asdf環境下のpythonで pip install
した場合などに、インストールがうまく反映できない場合に使います。
asdf reshim
実行例
今回はPythonとNode.jsを入れていきます。
グローバル環境に追加する
プラグインの追加
最初に必要なプラグインをインストールします。初回のみ必要です。
asdf plugin add python asdf plugin add nodejs
Python のインストール
今回は3.9.14をインストールします(そこそこ時間がかかります)。
asdf install python 3.9.14
global
を指定して有効化します。
asdf global python 3.9.14
動作確認(Python2が入っていたせいか、私の環境は初回のみ再ログインが必要でした)
python --version
Python 3.9.14
Node.jsのインストール
Pythonと同じ手順で、Node.jsの16.17.1も入れておきます。
asdf install nodejs 16.17.1 asdf global nodejs 16.17.1 node --version
v16.17.1
特定のディレクトリ内のみバージョンを指定する
比較用に、先ほどとは異なるバージョン(Python 3.8, Node.js 17.9)をインストールしておきます。
asdf install python 3.8.14 asdf install nodejs 17.9.1
確認用ディレクトリも作成しておきます。
mkdir -p ~/tmp-different-version/work
~/tmp-different-version
に移動して、各言語のバージョンを指定します。
cd ~/tmp-different-version
変更前
python --version
Python 3.9.14
node --version
v16.17.1
local
を指定して有効化します。
asdf local python 3.8.14 asdf local nodejs 17.9.1
変更後
python --version
Python 3.8.14
node --version
v17.9.1
カレントディレクトリのPythonとNode.jsのバージョンが変更されました。
当然、~/tmp-different-version
より下のディレクトリでも有効です。
cd ~/tmp-different-version/work python --version
Python 3.8.14
cd ~/tmp-different-version/work node --version
v17.9.1
なお、asdf local
を実行したディレクトリには.tool-versions
というファイルが作成されます。
ls -a ~/tmp-different-version
. .. .tool-versions work
.tool-versions
の中はこの様になっていて、asdfはこのファイルを参照してバージョンを変更します。
nodejs 17.9.1 python 3.8.14
まとめ
いかがでしたでしょうか。
anyenv よりもカバー範囲が広いこともあり、移行した例も少なからずある様です。
導入もさほど難しくないため、開発環境構築の選択肢として、ぜひ一度お試しいただければと思います。