Python プロジェクト管理したくて uv に触れてみたメモ

# これは何
2024の春先だっただろうか、pythonを使った開発を新しく始めようと思ったとき、環境管理何がいいのかなー？と調べていたところ、2024のトレンドは rye だ！という情報を沢山見ていたが、最近改めて調べ直してみると uv がトレンドだという話題を見て触ったことないなと思ったので python素人の自分が uv を触ってみたメモ

# uv について
https://github.com/astral-sh/uv

自分はPython界隈の事情に一切詳しくないので、正しく解釈できていないかもしれないが、ざっと調べた限りでは uv は rye の後継ツールで、rye は終わり、uv へ移行している過渡期のようだった。なら、これから始めるなら rye より uv の使い方を覚えるのが良さそうと感じた

# uv をインストールしてみる
手元の環境(win11+wsl2+ubuntu) には brewを導入済みなので `brew install uv` でよかった。
他にも色々インストール方法はありそうだった https://github.com/astral-sh/uv

# uv を使ってプロジェクトを初期化する
qiitaも含め、uvに関する多くの記事を見ると、`uv init example` とすることでプロジェクトの初期化を行えるようだったが、手元で試していて解せぬ疑問が一つ出てきた。
ホウボウを見て回った限りの uv の参考記事では `uv init example`するとプロジェクトフォルダ中に `src`ディレクトリが作られると書かれているのだが、何度試しても手元の初期化直後のツリーに `src`ディレクトリが無い。

```
❯ uv init example
❯ cd example 
❯ tree
.
├── README.md
├── hello.py
├── pyproject.toml
└── uv.lock
```
どうして... と途方に暮れて 小一時間悩んでいましたが下記のブログ記事に助けられました
- [uv 0.4.0 リリースノートより、Pythonプロジェクトの扱いの変更。再配布可能にするかを--appや--libフラグで指定する](https://nikkie-ftnext.hatenablog.com/entry/uv-0.4.0-specify-distributable-flag-app-or-lib#uv-040-%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%8E%E3%83%BC%E3%83%88)
- uv 0.4.0 リリースノート: https://github.com/astral-sh/uv/releases/tag/0.4.0

いわれて見ると、確かに自分の手元の uv は 0.4 以後だった。リリースノートの通りのようだった
```
❯ uv --version
uv 0.4.30 (Homebrew 2024-11-05)
```

0.4.0以後で `src` ディレクトリを初期化時に作成したい場合は `--lib` をつけると良さそうだった。
`uv init`のhelpにも記載があった。色々オプションがあるらしい

```
❯ uv init --help 
Create a new project

Usage: uv init [OPTIONS] [PATH]

Arguments:
  [PATH]  The path to use for the project/script

Options:
      --name <NAME>                    The name of the project
      --package                        Set up the project to be built as a Python package
      --no-package                     Do not set up the project to be built as a Python package
      --app                            Create a project for an application
      --lib                            Create a project for a library
      --script                         Create a script
      --vcs <VCS>                      Initialize a version control system for the project [possible values: git, none]
      --build-backend <BUILD_BACKEND>  Initialize a build-backend of choice for the project [possible values: hatch, flit, pdm, setuptools, maturin, scikit]
      --no-readme                      Do not create a `README.md` file
      --author-from <AUTHOR_FROM>      Fill in the `authors` field in the `pyproject.toml` [possible values: auto, git, none]
      --no-pin-python                  Do not create a `.python-version` file for the project
      --no-workspace                   Avoid discovering a workspace and create a standalone project
...
```

気を取り直して `--lib`をつけて初期化を再度実行してみた

```
❯ uv init example --lib
❯ cd example 
❯ tree
.
├── README.md
├── pyproject.toml
└── src
    └── example
        ├── __init__.py
        └── py.typed

3 directories, 4 files
```

無事に`src`フォルダを含むプロジェクトフォルダを作成することができた。
`src`フォルダを使って配布用の何かを作るとは限らないが 気になった差分は解消できた

# uv の環境を触る
https://github.com/astral-sh/uv を見て色々触る

## バージョン確認
```
❯ uv --version 
uv 0.4.30 (Homebrew 2024-11-05)
```

## プロジェクト初期化
```
uv init example
```

## venv作成、パッケージの同期
```
uv sync
```

## プロジェクトにツールやパッケージ追加
```
❯ uv add ruff
❯ uv run ruff --version
ruff 0.7.2
❯ uv run ruff check
All checks passed!```
```
ruff は高速な pythonの静的コード解析ツール
- https://github.com/astral-sh/ruff
- https://gihyo.jp/article/2023/03/monthly-python-2303

## 仮想環境のアクティベート
```
. .venv/bin/activate
```

## 仮想環境でpython実行
```
❯ python -V
Python 3.13.0

❯ python hello.py
Hello from example!
```

## ディアクティベートで仮想環境を抜ける
```
deactivate
```

## 仮想環境に入らず仮想環境のPythonを実行
```
❯ uv run python -V
Python 3.13.0

❯ uv run python hello.py
Hello from example!
```

## 仮想環境に入った状態と入っていない状態
```
uv add ruff しても仮想環境に入っていない状態では直接呼べない
❯ ruff --version
zsh: command not found: ruff

activate して仮想環境に入ると直接呼べる
❯ . .venv/bin/activate
❯ ruff --version
ruff 0.7.2
```

## uvx 使ってエフェメラル環境でツールを実行する
```
❯ uvx pycowsay 'hello world!'

  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||
```


# 感想
- 初めて触ったが、手軽に扱えてコマンドの実行も高速なのが良かった
- pythonの環境を整えるのがだいぶ楽になった気がする