Dev Containerとpoetryを使って開発環境を構築してみる。

# 前提
- 開発環境: VSCode の Dev Containers
- パッケージ管理: Poetry
- Dockerが自分のPC上で稼働していること

# 作業
## Dev Containerの導入
`Command + Shift + P`でパレットを開き、以下のように選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/bcd98644-1891-b481-9616-bbb58bc66ef5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/a8883c7f-24ab-6b5d-b5c6-0318c341a8b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/b31d92fe-1232-223d-ecff-41255363b477.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/aace6845-4d1f-c2b1-e20c-7b2409044f87.png)

すると、`.devcontainer/devcontainer.json`が作成されるので、ここの`poetry`のバージョンを追記する。

::: note info
.devcontainer/devcontainer.json
```json
{
	"name": "Python 3",
	"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bookworm",
	"features": {
		"ghcr.io/devcontainers-contrib/features/poetry:2": {
			"version": "1.7.1"    // ここを追加
		}
	}
```
:::

↑を追記した後、以下のようにReopenする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/bc6793a2-4ef9-1e67-a680-da16399a0bd6.png)


すると、Dev Containerで設定したバージョンの環境が出来上がるので、試しに以下のようにコマンドを打ってみる。

```bash
$ uname
Linux
$ python --version
Python 3.12.1
$ poetry --version
Poetry (version 1.7.1)
```

## poetryの設定

次に、poetryの設定をしていく。

```bash
$ poetry init
# 質問は全てEnterキーでスキップ
```

↑のコマンドを叩くと、`pyproject.toml`ファイルが作成される。

:::note info
pyproject.toml
```toml
[tool.poetry]
name = "udemy-llm-apps"
version = "0.1.0"
description = ""
authors = ["atsudora <atsudorasan@gmail.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```
:::

ついでに`README.md`ファイルも手動で作成しておく。
※`pyproject.toml`にREADMEを参照する記述があるため。

次に、poetryの設定ファイルを作成する。

```bash
$ poetry config virtualenvs.in-project true --local
```

↑のコマンドを叩くと、`poetry.toml`というファイルが作成される。

:::note info
poetry.toml
```toml
[virtualenvs]
in-project = true
```
:::
※これはこのディレクトリ配下にpythonパッケージが置かれることを記述している


poetryで用意した環境でpythonバージョン確認

```bash
$ poetry run python --version
Python 3.12.1
```

## streamlitを試してみる

poetryにstreamlitをインストールする

```bash
$ poetry add streamlit@1.30.0
```

`hello.py`ファイルを作成して以下のように記述する

```python
import streamlit as st

st.title("hello world")
```

```bash
$ poetry run streamlit run hello.py
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/e7ba09d6-683c-6f05-3314-c630391d48cd.png)

## Tips

途中で`Black formatter`などの拡張機能を入れた場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850024/9d61e857-07a2-0417-978d-f959edd4c83f.png)

:::note info
.devcontainer/devcontainer.json
```json
{
	"name": "Python 3",
	"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bookworm",
	"features": {
		"ghcr.io/devcontainers-contrib/features/poetry:2": {
			"version": "1.7.1"
		}
	},
    // 以下が追加されている
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-python.black-formatter"
			]
		}
	}
```
:::

保存時に自動でフォーマットする方法

::: note info
.vscode/settings.json
```json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "ms-python.black-formatter"
}
```
:::