先輩が使っているPoetryについて調べてみた

## 先輩が使っているPoetryについて調べてみた
自分でもPoetryを触ったことがあったのですが、いまいち理解しきれない部分もあったので、Poetryの特徴やよく使うコマンド、Pipとの比較について調べて理解を深めようと思います。

### Poetryの概要
Poetryは、Pythonの依存関係管理とパッケージングを簡単に行うためのツールです。Poetryを使うと、プロジェクトの依存関係を簡単に管理し、効率的に行うことができます。

##### 依存関係の管理
Poetryはpyproject.tomlファイルを使用して依存関係を定義します。これにより、プロジェクトの依存関係を簡単に追加、削除、更新できます。また、poetry.lockファイルを生成し、依存関係のバージョンを固定することで再現性のあるビルドを実現します。

##### 仮想環境の自動管理
Poetryはプロジェクトごとに仮想環境を自動的に作成・管理します。これにより、依存関係が他のプロジェクトと干渉することを防ぎ、開発環境を整えるのが簡単になります。

##### パッケージのビルドと公開
Poetryを使用すると、プロジェクトを簡単にパッケージ化し、PyPIなどのリポジトリに公開できます。これにより、自分のライブラリやアプリケーションを他の開発者と共有しやすくなります。ただし、この記事ではあまり触れません。

##### 直感的なコマンド
Poetryは使いやすいコマンドを提供しており、依存関係の追加、削除、更新、仮想環境の管理、パッケージのビルドと公開などの操作を簡単に行えます。

#### インストール手順
##### Mac
###### Homebrewがない場合
下記のコマンドを実行
```zsh:terminal
curl -sSL https://install.python-poetry.org | python3 -
```
###### Homebrewがある場合
下記のコマンドを実行
```zsh:terminal
brew install poetry
```
##### Windows
下記のコマンドを実行
```powershell:powershell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -
```
#### インストールの確認
下記のコマンドが実行できることを確認する
```zsh:terminal
poetry --version
```
下記の内容が表示されたら正常にインストールができています。
```zsh:terminal
Poetry (version 1.7.1)
```

#### よく使うコマンド
#### <基本コマンド>

##### 新しいPythonプロジェクトの初期化
新しいPythonプロジェクトを簡単に初期化することができます。このコマンドを使用すると、基本的なディレクトリ構造と必要なファイルが自動的に作成されます。
```zsh:terminal
poetry new
```
##### プロジェクトの初期化
プロジェクトの初期化を行います。このコマンドを実行すると、プロジェクトディレクトリ内に基本的な構成ファイルが生成されます。
```zsh:terminal
poetry init
```
##### 依存関係の追加
指定したパッケージをプロジェクトに追加します。
```zsh:terminal
poetry add <パッケージ名>
```
##### 開発依存関係の追加
開発環境でのみ必要な依存関係を追加します。
```zsh:terminal
poetry add --group dev <パッケージ名>
```
##### 依存関係の削除
指定したパッケージをプロジェクトから削除します。
```zsh:terminal
poetry remove <パッケージ名>
```
##### プロジェクトのアップデート
すべての依存関係を最新バージョンに更新します。
```zsh:terminal
poetry update
```

#### <仮想環境管理>
通常VSCodeやPyCharm等統合開発環境を使用して開発をしている場合、統合開発環境からターミナルを立ち上げると、自動的にpoetry shellが実行された状態になります。従って下記のコマンドを使用することはあまりありません。
##### 仮想環境へのアクセス
仮想環境内で指定したコマンドを実行します。
```zsh:terminal
poetry run <コマンド>
```
##### 仮想環境のアクティベイト
新しいシェルを起動し、仮想環境をアクティブにします。以降実行されたコマンドは、仮想環境内で実行されることになります。
```zsh:terminal
poetry shell
```

#### <その他日常的に使うコマンド>
##### プロジェクトの依存関係をインストール
poetry.lockファイルに基づいて依存関係をインストールし、プロジェクトの仮想環境を構築します。poetry.lockファイルが存在しない場合は、まず依存関係を解決し、新しいロックファイルを生成します。
```zsh:terminal
poetry install
```
##### 依存関係のロックファイルを生成または更新
pyproject.tomlファイルに基づいて依存関係が解析され、poetry.lockファイルが更新されます。このファイルは、プロジェクトの依存関係の正確なバージョンを記録しているため、再現性のあるビルドを可能にします。
```zsh:terminal
poetry lock
```
#### 使用するPython Interprerterの表示・変更
##### Python Interprerterの表示
現在のPoetry仮想環境に関する情報を表示するために使用されます。このコマンドを実行すると、仮想環境のパス、Pythonのバージョン、依存関係のインストール状態など、プロジェクトの環境に関する詳細情報が得られます。
```
% poetry env info

Virtualenv
Python:         3.12.2
Implementation: CPython
Path:           /Users/<<user name>>/git/<<project_name>>/.venv
Executable:     /Users/<<user name>>/git/<<project_name>>/.venv/bin/python
Valid:          True

Base
Platform:   darwin
OS:         posix
Python:     3.12.2
Path:       /Users/<<user name>>/.pyenv/shims/versions/3.12.2
Executable: /Users/<<user name>>/.pyenv/shims/versions/3.12.2/bin/python3.12
```
`<<user name>>`と`<<project_name>>`には実際のユーザ名とプロジェクト名が入ります。

##### Python Interprerterの変更
`<<user name>>`には実際のユーザ名が入ります。
```
% poetry env use 3.12.3
Using virtualenv: /Users/<<user_name>>/git/<<project_name>>/.venv
```
使用するPython Interpreterのバージョンを変えたいときに使うと、依存関係の管理が簡単になります。

#### Pipとの比較
以下にPipとPoetryの比較をテーブル形式でまとめてみました。
| 特徴 | Poetry | Pip |
|:-----------|:------------|:------------|
| 基本機能       | 依存関係管理、パッケージビルド、仮想環境管理        | パッケージのインストール、アンインストール、アップグレード         |
| 設定ファイル     | pyproject.toml      | requirements.txt       |
| ロックファイル       | poetry.lock        | なし         |
| 仮想環境管理         | 内蔵          | venvやvirtualenvと組み合わせて使用    |
| 依存関係解決       | 強力な依存関係解決と競合の自動解決       | 基本的な依存関係管理のみ       |
| 使いやすさ    | コマンドが直感的で、セットアップや管理が簡単     | 非常にシンプルで、ほとんどのプロジェクトで標準的      |
| 再現性    |　ロックファイルで再現性を確保    |　依存関係のバージョン固定が難しい    |
| 統合度    |　総合的なプロジェクト管理ツール    |　パッケージ管理ツールとして単機能    |

## まとめ
インストール方法やよく使うコマンドなど調べてみた結果、今まで以上に理解できたと思います。しかし、実際に使った経験がほとんどないため、理解するのに時間がかかる部分もありました(依存関係とは何なのか、Pipとの違いと使い道に違いはあるのか、など)。
AWS Lambdaのコードをローカル環境で開発するときなど、簡潔・シンプルに実装すべきプロジェクトにはpipが適しており、たくさんのライブラリを必要とし、複雑な依存関係を管理しなければいけないプロジェクトにはPoetryが適していることがわかりました。

## 参考資料
https://qiita.com/nassy20/items/bd84d67ca5051efc7ffa