WSL2環境にuvを用いてPython環境を構築し、VSCodeから利用する

# はじめに
WSL2上にPython環境を構築したため、備忘録として記録する。

# WSL2 関連
### 1. WSL2のインストール
インストール済みのため割愛

### 2. WSLのアップデート
```powershell
PS > wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。
PS > wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
```

### 3. Ubuntu 24.04 LTSをインストール
```powershell
PS > wsl --install -d Ubuntu-24.04
PS > ...
PS > wsl -l -v
  NAME              STATE           VERSION
* Ubuntu-24.04      Running         2
```

### 4. Ubuntu 24.04の初期設定
```bash
$ sudo sed -i 's/\/\/archive.ubuntu.com/\/\/jp.archive.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install language-pack-en language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ echo $LANG
ja_JP.UTF8
```
# uv 関連
### 1. uv のインストール
```bash
$ curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.4.13 x86_64-unknown-linux-gnu
installing to $HOME//.cargo/bin
  uv
  uvx
everything's installed!

To add $HOME/.cargo/bin to your PATH, either restart your shell or run:

    source $HOME/.cargo/env (sh, bash, zsh)
    source $HOME/.cargo/env.fish (fish)
```
### 2. Shell 補完の設定
```bash
$ echo 'eval "$(uv generate-shell-completion bash)"' >> ~/.bashrc
```
### 3. バージョンの確認
```bash
$ uv --version
uv 0.4.13
```

### 4. Python 仮想環境の作成
```bash
$ mkdir python_projects 
$ cd python_projects
$ uv init test_project
$ cd test_project
$ pwd
$HOME/python_projects/test_project
```
例) beautifulsoup4 のインストール
```bash
$ uv add beautifulsoup4
Using Python 3.12.3 interpreter at: /usr/bin/python3.12
Creating virtual environment at: .venv
Resolved 3 packages in 58ms
Prepared 2 packages in 26ms
Installed 2 packages in 1ms
 + beautifulsoup4==4.12.3
 + soupsieve==2.6
```

# VSCode との連携
### 1. 拡張機能のインストール
- Remote Development

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

### 2. Remote Development で WSL2上に先程作成した`test_project`を開く
1. hello.pyが存在するため、以下の内容を記載
    ```py
    from bs4 import BeautifulSoup
    soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
    print(soup.prettify())
    ```
1. WSL環境上にPython拡張機能のインストールを実施

https://marketplace.visualstudio.com/items?itemName=ms-python.python

### 3. VSCodeが自動的に`.venv`を認識するため、VSCodeのターミナルを起動し普段通りにPythonを実行する
```bash
$ python ./hello.py
<p>
 Some
 <b>
  bad
  <i>
   HTML
  </i>
 </b>
</p>
```

# Ruff の有効化
### 1. Ruff のインストール
```bash
$ uv tool install ruff
$ uv tool update-shell
```
### 2. VSCode へのRuff拡張機能のインストール
https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff

### 3. settings.json に Ruff 関連の設定を追加
```json
{
    "[python]": {
        "editor.codeActionsOnSave": {
            "source.fixAll": "explicit",
            "source.organizeImports": "explicit"
        },
        "editor.defaultFormatter": "charliermarsh.ruff"
    },
    "ruff.lineLength": 120,
    "ruff.lint.ignore": [
        "F401"
    ],
    "ruff.lint.preview": true,
    "ruff.lint.select": [
        "C",
        "E",
        "F",
        "W",
        "I"
    ],
    "ruff.logFile": "~/logs/ruff.log",
    "ruff.logLevel": "debug",
    "ruff.nativeServer": "on",
}
```

### 4. WSL2のログを確認
```bash
$ cat ruff.log
   0.002372427s DEBUG ThreadId(04) ruff_server::session::index::ruff_settings: Ignored path via `exclude`: $HOME/python_projects/test_project/.venv
   0.006645611s  INFO ruff:main ruff_server::server: Configuration file watcher successfully registered
   0.006686709s DEBUG ruff:worker:0 ruff_server::resolve: Included path via `include`: $HOME/python_projects/test_project/hello.py
  25.151748855s  INFO     ruff:main ruff_server::server::connection: Shutdown request received. Waiting for an exit notification...
  25.156159853s  INFO     ruff:main ruff_server::server::connection: Exit notification received. Server shutting down...
```
- Ruff が native language server で動作していることを確認

https://github.com/astral-sh/ruff-vscode?tab=readme-ov-file#native-server