asdf+Poetry+PyCharmでPython開発環境構築

# 概要
掲題の組み合わせでPythonの開発環境を構築してみた時のメモです。
これでがっつり開発をやってみたわけではなく、とりあえずそれっぽくなったぜ！というだけで、ベストプラクティスとかではありません。

# 環境
* macOS Monterey(Apple M1)
* zsh

# 内容
## asdfについて
asdfとはいわばpyenvの多言語対応版といったところです。pyenvは様々なバージョンのPython処理系をインストールしたり切り替えたりできるツールですが、pyenvがPython専用なのに対してasdfは複数の言語に対応している点が異なります。

ふざけた名前のくせに
非常に便利ですね。

まあpyenvでもいいのですが、asdfに慣れておけば応用がききそうなので今回はそちらにしました。

### asdfのインストール

いくつか方法があるようですが、Homebrewを使うのが無難でしょう。

```
brew install asdf
```

それから.zshrcに必要な記述を追記します。

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

これでasdfが使えるようになりますが、asdfでPythonをインストールするにはasdfのプラグインを追加する必要があります。

```
asdf plugin add python
```

これでOKです。

### asdfでPythonをインストール

まずはインストール可能なPython処理系の一覧を表示します。

```
asdf list-all python
```

長いので記載しませんが、これでインストール可能な一覧がずらずらと縦に表示されます。

今回は3.10.3をインストールしてみます。

```
asdf install python 3.10.3
```

これでインストールされますが、この時点ではシステムのPythonを指したままになっていて使えません。
手っ取り早く使えるようにするにはglobalサブコマンドを使用します。

```
asdf global python 3.10.3
```

これで`python`および`python3`コマンドが上記でインストールしたPythonを指します。
元に戻すには以下を実行します。

```
asdf global python system
```

あとよく使いそうなのは以下のような感じでしょうか。

インストール済みのバージョン一覧を表示
```
asdf list python
```

現在参照しているバージョンを表示
```
asdf current python
```

アンインストール
```
asdf uninstall python 3.10.3
```

複数言語対応の代償として、いちいちpythonって打たないといけないのが若干面倒ですね。

## Poetryについて
asdfでインストールしたPythonに直接pipでライブラリをインストールすることもできますが、おそらくやめておいたほうがいいでしょう。
それはあくまで「コピー元」として、プロジェクトごとに仮想環境を作ってそこにインストールしていくほうが安全です。
仮想環境を作るためのツールはいくつかありますが、ここでは比較的新しいPoetryを試してみます。
Poetryは仮想環境を作る機能のほか、pipのようにライブラリをインストールする機能も持っています。

### Poetryのインストール
PoetryのインストールにはPythonを使用します。また、（たぶん？）インストール時に使用したPythonに依存するようなので、Poetryインストール時に参照していたPython処理系は消さないほうがいいです。システムのPythonを使ってインストールするといいのかもしれません。

以下のコマンドを実行してインストールします。
```
curl -sSL https://install.python-poetry.org | python3 -
```

それから`$HOME/.local/bin` をパスに追加します。

うまくいっていれば`poetry`コマンドが使えるようになります。

```
poetry --version
```

### PyCharmからPoetryを使用する
Poetryはコマンドラインツールですが、仮想環境を作る部分についてはGUI操作でPyCharmから実行できます。

スクショ貼るのが面倒なので以下を参照してください。（詩ってなんやねんというのはさておき）
https://pleiades.io/help/pycharm/poetry.html

Base interpreterにはasdfでインストールしたものを指定するといいでしょう。
インストール済みの一覧は`/Users/ユーザ名/.asdf/installs/python` にあります。
（これを直接参照するのが正しいのか怪しい気もしますが、まあ仕方ないでしょう。たぶん）

うまく仮想環境を作れればPyCharm上からはその環境を参照するので、直接`poetry`コマンドであれこれするよりも少し便利になります。
PyCharm上から起動したターミナルもその環境を参照するので、`poetry`コマンドを使う操作も安心して実行できます。

### Poetryの良さそうな点
これで開発をやってみたわけじゃないのであれですが、Poetryは依存ライブラリの追加時に必ず設定ファイル（pyproject.toml）にライブラリ名のそのバージョンが記録されるのが良いなと思いました。

仮想環境を作ってプロジェクトローカルにライブラリをインストールするという目的ならvenvとpipの組み合わせでも可能ですが、pipを使った場合は明示的に出力しない限りインストール済みライブラリとバージョンが出力されないので、ある環境を他の人の環境でも再現させるという点において難があるのかなと。できるけど、下手すると漏れる恐れがあるという点が微妙。
（Pythonを本格的には書いたことがないので想像です。違ったらすみません）

### Poetryのちょっと気になった点

細かい点ではあるのですが、PyCharmからvenvで仮想環境を作った時は、仮想環境の実体がプロジェクトディレクトリの下にできるので、プロジェクトのディレクトリを消せば仮想環境も含めて全部消えるようになっていました。
しかし、Poetryでは仮想環境は別のところに作成されるので、プロジェクトのディレクトリを消しても仮想環境が残ります。別途消す必要があるのがちょっと面倒だなと思いました。


（追記）
コメントにて、プロジェクトのディレクトリ配下に仮想環境を作成する方法を教えていただきました。
以下のコマンドを実行すればOKです。
```
poetry config virtualenvs.in-project true
```

設定値は以下のコマンドで確認可能です。
```
poetry config --list
```
他にディレクトリの設定等もありますが、そちらはそのままでよさそうです。
ただし、既存の仮想環境は削除しておかないと適用されないようでした。

# まとめ
勉強用に個人で開発するくらいならシステムのPython + venv + pipでもよさそうですが、実務での開発ではasdf（もしくはpyenv）でバージョン管理し、Poetryで仮想環境作成 + ライブラリ依存管理がよさそうに思いました。おそらく。


# 参考リンク
* https://asdf-vm.com/guide/getting-started.html#_1-install-dependencies
* https://blog.haryoiro.com/asdf-makes-tedious-language-version-control-easy/
* https://dev.icare.jpn.com/dev_cat/how_to_use_asdf/
* https://random-tech-note.jp/install-asdf/
* https://qiita.com/ksato9700/items/b893cf1db83605898d8a
* https://python-poetry.org/docs/master/
* https://pleiades.io/help/pycharm/poetry.html