launch.json を活用して VS Code デバッグ環境を最適化

### `launch.json` とは？
`launch.json` は **VS Code** で **デバッグ構成** を定義するための設定ファイルになります。このファイルを使うことで、**どのようにデバッグ実行するか** を設定できます。Pythonでの開発において便利だったので忘備録として記録します。

---

### **`launch.json` の場所**
基本はVS Code のプロジェクトフォルダ内の `.vscode/launch.json` に配置します。

---

### **Python の `launch.json` の基本構造**
Python のデバッグ設定を `launch.json` に記述すると、例えば以下のようになります。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: ファイルを実行",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}
```

### **設定項目の解説**
| 設定キー           | 説明 |
|--------------------|----------------------|
| `"version"`       | 設定のバージョン (通常 `0.2.0`) |
| `"configurations"` | 複数のデバッグ設定を配列で定義 |
| `"name"`          | デバッグ構成の名前 (VS Code のデバッグメニューに表示) |
| `"type"`          | 使用するデバッガ (`python` に設定) |
| `"request"`       | `launch`（新しいプロセスで開始）または `attach`（既存のプロセスにアタッチ） |
| `"program"`       | 実行したい Python ファイルのパス (`${file}` は現在開いているファイル) |
| `"console"`       | `integratedTerminal`（VS Code のターミナルで実行） |

`name` は **任意の名前** を自由に決めて大丈夫です。  
VS Code の **デバッグメニュー** に表示される名前なので、わかりやすいものを設定すると便利です。
複数の設定を定義するときは、`name` を工夫すると何をデバッグするのか管理しやすくなります。

#### **① シンプルな名前**
```json
{
    "name": "Python: メインスクリプト"
}
```
- シンプルに「メインスクリプト」として、どの設定かわかりやすく。

#### **② プロジェクト名を入れる**
```json
{
    "name": "MyProject: 開発モード"
}
```
- **プロジェクト名** を入れることで、複数のデバッグ設定がある場合でも識別しやすい。

#### **③ 実行環境ごとに分ける**
```json
{
    "name": "Flask API (開発環境)"
}
```
```json
{
    "name": "Flask API (本番環境)"
}
```
- **環境** (開発・本番など) を区別すると便利。

#### **④ テスト実行用の設定**
```json
{
    "name": "pytest: 単体テスト"
}
```
- **テスト用のデバッグ設定** だと一目でわかる。

---


### **カスタマイズ例**

#### **① コマンドライン引数を渡す**
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 引数あり",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/script.py",
            "args": ["arg1", "arg2"],
            "console": "integratedTerminal"
        }
    ]
}
```
- `args` に `"arg1", "arg2"` を指定すると、`script.py` は `python script.py arg1 arg2` のように実行される。


#### **② 環境変数を設定**
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 環境変数設定",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/app.py",
            "console": "integratedTerminal",
            "env": {
                "API_KEY": "your_api_key",
                "DEBUG": "true"
            }
        }
    ]
}
```
- `env` で環境変数を設定し、Python コード内で `os.environ["API_KEY"]` のように取得可能。


#### **③ FastAPI のデバッグ**
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "FastAPI: サーバー起動",
            "type": "python",
            "request": "launch",
            "module": "uvicorn",
            "args": [
                "main:app",
                "--host", "127.0.0.1",
                "--port", "8000",
                "--reload"
            ],
            "jinja": true
        }
    ]
}
```
- "module": "uvicorn" → uvicorn を使って FastAPI アプリを起動。
- "args" に FastAPI アプリのモジュール名 (main:app) を指定。
- --host, --port, --reload で開発環境向けの設定を追加。

#### **④ 既存の Python プロセスにアタッチ**
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: アタッチ",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            }
        }
    ]
}
```
- 既に動作中の Python アプリ（例えばサーバー）にデバッガを接続。
- debugpy を使って待機させると、この設定でアタッチできる。


| 設定 | 例 | 用途 |
|------|----|----|
| **引数を渡す** | `"args": ["arg1", "arg2"]` | コマンドライン引数付き実行 |
| **環境変数を設定** | `"env": { "API_KEY": "xxx" }` | API キーや設定値の管理 |
| **標準的な FastAPI デバッグ** | `"module": "uvicorn"` | Web アプリのデバッグ |
| **既存プロセスにアタッチ** | `"request": "attach"` | すでに動作しているアプリにデバッガ接続 |

---

### **まとめ**  
   - VS Code のデバッグ構成を定義するファイル。  
   - `.vscode/launch.json` に配置される。  
   - **デバッグの効率化**: 毎回手動でスクリプトを実行する手間を省ける。  
   - **環境ごとの設定を簡単に切り替え可能**: `"configurations"` で複数のデバッグ設定を管理。  
   - **コマンドライン引数や環境変数を自由に変更できる**: フレキシブルな開発環境を実現。     - Python 以外にも JavaScript、Node.js、Go など様々な言語に対応。  
   - **基本のデバッグ設定を作成し、プロジェクトごとにカスタマイズするのがベスト！**