バージョン管理ツール asdf でディレクトリごとにPythonのバージョンを指定する

バージョン管理ツール「asdf」を使ってみました。ドキュメントも使いやすく、おすすめのツールです。
2021.06.06

おはこんばんちは。オペレーション部のもっさんです。
今回は バージョン管理ツール asdf を利用して、ディレクトリごとに異なる Python のバージョンを使用するよう設定してみました。

なぜバージョン管理ツールが必要?

同時進行で複数のプロジェクトの開発やメンテナンスを行っていると、それぞれのプロジェクトで使用されているプログラミング言語のバージョンが異なる場合があります。
一般的に、開発を行なっている環境で使用している言語のバージョンと、本番運用されているサーバにインストールされている言語のバージョンは統一したほうが無難です。

例えば、あなたは現在以下のような状況にあるとしましょう。

  • あなたが持っているPCにインストールしている Python バージョンは 3.9.1
  • あなたは2つのプロジェクトA,Bを並行して担当している
  • ブロジェクトA では Python 3.7.10 を使用している
  • プロジェクトB では Python 3.8.8 を使用している

プロジェクト毎に使用するバージョンを使い分けるには、手元にある開発用PCにプロジェクトで使用するバージョンを都度インストールし、 python コマンドで呼び出されるバージョンを変更するために、適宜環境変数の参照先を変更する必要があります。
ただ、都度 Python の異なるバージョンをインストールし直したり、パスの参照先を変更するのは大変ですよね。
そこで、pyenv や anyenv 、今回紹介する asdf などは、導入すると利用環境のバージョン切り替えを楽に行えるようになります。

asdf の特徴のひとつに、プログラミング言語のバージョンだけではなく、 eksctl や Terraform 等のツールのバージョンも管理できることが挙げられます。
asdf で管理可能なプログラミング言語・ツールの一覧は、公式ドキュメントで確認ができますので、導入時の参考としてください。

筆者環境

OS : Mac OS Big Sur
シェル : zsh
ターミナル : Visual Studio Code
パッケージ管理ツールとしてHomebrewをインストール済み

asdf 導入してみた

それでは、さっそく asdf を使ってみましょう。 本記事では、asdf のインストールから、2つのディレクトリにそれぞれ異なる Python バージョンを使用するように指定するところまでを実施します。

asdf のインストール

ドキュメントの導入手順に従って、インストールを進めていきます。
ドキュメントは、自分が使用している OS やインストール方法をプルダウンメニューから選択すると、環境に合わせたコマンドが表示されるようになっています。非常に便利なので活用しましょう。
私の場合は、 Homebrew を経由してインストールを行いました。

# asdf のインストール
$ brew install asdf

インストールが完了したら、asdf をシェルに追加して、asdfコマンドを使用可能にします。
zsh の場合

echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

bash の場合

$ echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile

Python プラグインをインストール

python プラグインをインストールします。
まずは、インストール可能なプラグインのリストに Python が含まれているかを確認してみましょう。  

# asdf でインストール可能なプラグインのリストを確認する
$ asdf plugin list all

# インストール可能なプラグイン名と、プラグインのリポジトリURLが表示される
〜中略〜
python                       https://github.com/danhper/asdf-python.git
〜省略〜

Python プラグインがインストール可能であることが確認できました。
asdf plugin add <プラグイン名>コマンドを実行して、プラグインのインストールを行います。

# Python プラグインをインストール
$ asdf plugin add python

既にインストールされているプラグインは、asdf plugin list でリストを確認可能です。

# インストール済みのプラグインのリストを確認する
$ asdf plugin list 
python

使用する Pythonのバージョンを指定する

使用したい Python のバージョンをインストールします。使用可能なプラグインのバージョンのリストを取得し、その中からバージョンを指定してインストールします。

# 使用可能な Python のバージョン一覧を取得する
# asdf list all <プラグイン名>
$ asdf list all python

# バージョンを指定してインストール
# asdf install python <バージョン>
$ asdf install python 3.7.10

〜中略〜
# 以下のメッセージが表示されればインストール成功
Installed Python-3.9.5 to /Users/User1/.asdf/installs/python/3.7.10

今回はディレクトリ毎にバージョンを切り替え可能であることを確認するため、3.7.103.8.103.9.1の3つのバージョンをインストールします。
同様に3.8.103.9.1のバージョンでも、asdf install python <バージョン>コマンドを実行しておきます。

インストール後は、どのバージョンをどのディレクトリで使用するかを設定する必要があります。
グローバルで利用するバージョンと、ディレクトリ内でのみ利用するローカルバージョンをそれぞれ指定可能です。

# グローバルで使用するバージョンを指定する
# asdf global <プラグイン名> <バージョン名>
$ asdf global Python 3.9.1

# ローカル(ディレクトリ内)で使用するバージョンを指定する

# テスト用のディレクトリを作成する
$ mkdir dir-test1

# バージョン指定をしたいディレクトリをカレントディレクトリにする
$ cd dir-test1

# asdf local <プラグイン名> <バージョン名>
$ asdf local Python 3.7.10

上記の設定コマンドを実行すると、カレントディレクトリ配下に.tool-versionsというファイルが作成されます。
このファイルが、ディレクトリで使用するプラグインのバージョン情報を管理しています。

$ ls
./              ../             .tool-versions

# .tool-versionsの中身を確認してみる
$ cat .tool-versions
python 3.7.10

# Python のバージョンを確認する
$ python -V
Python 3.7.10

ディレクトリ毎にバージョンが指定できているか確認する

実際にディレクトリ毎にバージョン指定ができているか確認します。
dir-test1以外にテスト用のディレクトリを2つ作成し、dir-test2には Python バージョン3.8.10を使用するように設定します。dir-test3ではasdf localコマンドを実行せず、グローバルで設定したバージョン3.9.1が使用されていることを確認します。

# カレントディレクトリの移動
$ cd dir-test2

# dir-test2 で使用する Python バージョンを 3.8.10 に指定
$ asdf local Python 3.8.10

# Python のバージョンを確認する
$ python -V
Python 3.8.10

# カレントディレクトリの移動
$ cd ../dir-test3

# Python のバージョンを確認する
# グローバルで設定したバージョン 3.9.1 となるはず
$ python -V
Python 3.9.1

参考情報