【Python】Ryeで始めるPythonプロジェクト

追記 : uvの記事も一緒に見ていただければと思います。

https://qiita.com/kissy24/items/0c091bb5f12d697131ae

## はじめに

PoetryやPipenvではなく、**Rye**を使って開発を進めたい方向けの記事になります。
本稿は、ハンズオン形式で誰でも気軽にプロジェクトを作れるようになっています。

### ハンズオン環境

- Ubuntu / MacOS
- VSCode 
- Rye : 0.24.0

## 0. Ryeとは？

RyeはPythonのための包括的なプロジェクトおよびパッケージ管理ソリューションです。
使用感としては、`Anaconda`のように独立してインストールでき、`pipenv`や`poetry`のように利用できる良いとこどりのような感じです。

https://rye-up.com/

また、大元のAstralは、`ruff`や`uv`等、今後のPython実行環境を刷新するようなパッケージを多数生み出しているため、`Rye`含めAstaral製のエコシステムが主流になっていくのかなと思います。
(ちなみにどれもRust実装で軽快に動いてくれます)

https://github.com/astral-sh

## 1. インストール編

基本的には、公式の誘導に従います。
(Windowsへのインストールは本稿では扱わないので公式見てね)

https://rye-up.com/guide/installation/

### 1.1. ダウンロードする

まず、curlコマンドを実行しましょう。適したバイナリファイルが落ちてきます。

```sh
curl -sSf https://rye-up.com/get | bash
```


下記は対話ログです。

```bash
This script will automatically download and install rye (latest) for you.
######################################################################## 100.0%
Welcome to Rye!

This installer will install rye to /home/kissy24/.rye
This path can be changed by exporting the RYE_HOME environment variable.

Details:
  Rye Version: 0.24.0
  Platform: linux (x86_64)

✔ Continue? · yes
✔ Select the preferred package installer · uv (quick but experimental)
✔ Determine Rye's python Shim behavior outside of Rye managed projects · Make Rye's own Python distribution available
✔ Which version of Python should be used as default toolchain? · cpython@3.12
Installed binary to /home/kissy24/.rye/shims/rye
Bootstrapping rye internals
Downloading cpython@3.12.1
Checking checksum
success: Downloaded cpython@3.12.1
Upgrading pip
Installing internal dependencies
Updated self-python installation at /home/kissy24/.rye/self

The rye directory /home/kissy24/.rye/shims was not detected on PATH.
It is highly recommended that you add it.
✔ Should the installer add Rye to PATH via .profile? · yes
Added to PATH.
note: for this to take effect you will need to restart your shell or run this manually:

    source "$HOME/.rye/env"

For more information read https://mitsuhiko.github.io/rye/guide/installation

All done!
```

対話型で進行します。内容について簡単に説明すると

| 質問 | 返答 | 
| ---- | ---- |
| 1. 入れるRyeのバイナリは問題ないか | yes |
| 2. パッケージ・インストーラーを選択してください | uv (quick but experimental) | 
| 3. RyeでPythonを管理するか | Make Rye's own Python distribution available | 
| 4. どのPythonバージョンをデフォルトにするか | Enterで推奨バージョンが入ります | 
| 5. RyeのPATHを`.profile`に追加するか | yes | 

開発シーンにあわせて、pipや管理方法などを選びましょう。今回はこれで進めます。

### 1.2. PATHを通す(.profile参照していない環境向け)

`bashrc`や`zprofile`・Fish Shellを利用している場合、別途PATHを追加する必要があります。

```sh:bash
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
```
```sh:zsh
echo 'source "$HOME/.rye/env"' >> ~/.zprofile
```
```sh:fish
set -Ua fish_user_paths "$HOME/.rye/shims"
```

### 1.3. Shellの補完スクリプトを入れる

補完スクリプトも提供されているので、そちらも入れましょう。

```sh:bash
mkdir -p ~/.local/share/bash-completion/completions
rye self completion > ~/.local/share/bash-completion/completions/rye.bash
```
```sh:zsh
rye self completion -s zsh > ~/.zfunc/_rye
```
```sh:fish
rye self completion -s fish > ~/.config/fish/completions/rye.fish
```

### 1.3. Rye自体をアップデートする

最後にRye自体をアップデートします。

```sh
rye self update
```

## 2. 新規プロジェクト作成編

### 2.1. プロジェクトを作成する

`rye init`を用いてプロジェクトを作成していきます。

```sh
rye init rye-sample-project
cd rye-sample-project
```

既にプロジェクトのフォルダがある場合は、下記でOKです。

```sh
cd rye-sample-project
rye init
```

そうすると以下のようなフォルダ構成が出来上がります。

```
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── my_project
        └── __init__.py
```

:::note warn
**注意点**
`pyproject.toml`の`authors`にGitHubの登録emailアドレスがデフォルトで記載されてしまうため、嫌な人は下記のように変更することをおすすめします。
```toml
# 変更前
authors = [
    { name = "kissy24", email = "hogehoge@gmail.com" }
]

# 変更後
authors = [
    { name = "kissy24" }
]
```
:::

### 2.2. Ruffを入れる

とりあえずと`Linter`と`Formatter`は必須なので入れましょう。
Ryeを選ぶ人はRuffも視野にあると思うのでこちらを入れましょう。

https://github.com/astral-sh/ruff

```sh
rye add ruff
```

ライブラリを追加したら必ずSyncしましょう。

```sh
rye sync
```

そうすると`.venv`フォルダと`requirements.lock` 、`requirements-dev.lock`が生成されます。
lock側には入れているライブラリの一覧が入り、venv側にパッケージそのものが入ります。

:::note info
**Tips**
pipenvだと作業ディレクトリ上に`.venv`フォルダを生成するには下記オプションがいるのですが、ryeはデフォルトで作ってくれます。

```sh
PIPENV_VENV_IN_PROJECT=true
```
:::

おっと、ruffは開発でしか必要の無いライブラリでしたね。
こういうときはdevパッケージとしてインストールしましょう。

```sh
# 一旦ruffを削除します
rye remove ruff
# devパッケージとしていれます
rye add --dev ruff
rye sync
```

:::note info
**Tips**
こうすると、`requirements-dev.lock`にのみ、ruffが記載されていると思います。
このプロジェクトを実行用途のみで使う場合は下記のように`sync`してください。

```sh
rye sync --no-dev
```
`.venv`上にruffのパッケージが含まれていなければ成功です。
:::

### 2.3. hello worldする

最後に、hello worldしてみましょう。

```sh
>>> rye run hello
Hello from rye-sample-project!
```

ryeで無事プロジェクトを作ることができました。ここからは自由に開発していくと良いでしょう。
ここまでが、ハンズオンになります。

下記に、ハンズオンのコードを置いてますのでよければ確認してみてください。

https://github.com/kissy24/rye-sample-project

## 3. おまけ

VSCodeでruffを使う場合の設定とpytestの導入方法を紹介します。

### 3.1. VSCodeのruff設定を追加する

VSCodeユーザーは必ずこれを入れましょう。

https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff

`ruff`で自動フォーマットするためには下記の設定を記載する必要があります。

```json:settings.json
{
    "[python]": {
        "editor.codeActionsOnSave": {
            "source.fixAll.ruff": "explicit",
            "source.organizeImports.ruff": "explicit"
        }
    }
}
```

今回はこれをプロジェクトフォルダ内に定義します。そうすると、複数人で作業する際にフォーマットすることを強制できます。

```
.
├── .vscode
|    └── settings.json
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── my_project
        └── __init__.py
```

### 3.2. pytestを導入する

devパッケージに`pytest`と`pytest-cov`を追加します。
(場合によっては、`pytest-mock`と`pytest-freezegun`を入れておくと捗ります)

```sh
rye add --dev pytest
rye add --dev pytest-cov 
rye sync
```

## おわりに

いかがでしたでしょうか？ 従来のPython環境構築は割とめんどくさく環境も汚れがちだったのですが、`Rye`を使うと環境をあまり汚さずにエコシステムができあがります。(ruffやuvも使うとなお良い)
今後はAstaral製のものが主流になってくるので、まずは気軽にこんな感じで試してみるのが良いかと思います。