開発言語のバージョン管理にasdfはいかがですか

記事タイトルとURLをコピーする
  • 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の導入は↓の記事を参考にしました(行武さんありがとうございます)。

blog.serverworks.co.jp

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 よりもカバー範囲が広いこともあり、移行した例も少なからずある様です。

導入もさほど難しくないため、開発環境構築の選択肢として、ぜひ一度お試しいただければと思います。