Ryeを使ってみた

## Ryeとは

新興のPythonのバージョン管理、パッケージ管理、依存関係の管理や仮想環境(virtualenvs)の管理をしてくれるツールです。
ワンストップで上記を管理し、Rust製で早いよっていうのが売りらしいです。

まだ試験段階とのことですが、個人開発レベルではあれば問題ないと思います。

[Rye 公式サイト](https://rye.astral.sh/guide/)

## 今回の環境

MacOS(Apple silicon)

## インストール

インストールは下記コマンドを実行するだけです。

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

インストール中に幾つか質問されます。基本的にはyesでいいと思いますが、2つ目の質問は気をつけてください。

```bash
? What should running `python` or `python3` do when you are not inside a Rye managed project? › 
❯ Run a Python installed and managed by Rye 
  Run the old default Python (provided by your OS, pyenv, etc.)
```

よくわからないときは、後者を選択しておけばいいと思います。
気になる方は下記が詳細です。

<details><summary>詳細を見る</summary><div>
メッセージの内容:

Ryeが管理していないプロジェクトのディレクトリで、pythonやpython3コマンドを実行した場合、どのPythonを使用しますか？

選択肢:

1. Ryeがインストールおよび管理しているPythonを実行する
2. 従来のデフォルトのPythonを実行する（OSやpyenvなどが提供するもの）

解説:

選択肢1（RyeのPythonを使用）
このオプションを選ぶと、たとえRyeで管理されていないプロジェクトやディレクトリ内でも、pythonやpython3コマンドは常にRyeが管理しているPython環境を使用します。これは、システム全体で統一されたPython環境を維持したい場合や、RyeのPython環境をデフォルトとして使用したい場合に便利です。

選択肢2（従来のデフォルトPythonを使用）
こちらを選ぶと、Ryeで管理されていないプロジェクトやディレクトリでは、システムに元々インストールされているPythonや、pyenvなど他のバージョン管理ツールで設定されたPythonを使用します。つまり、Ryeの影響はRye管理下のプロジェクト内に限定され、他の環境やプロジェクトでは従来の設定をそのまま維持します。

どちらを選ぶべきか:

RyeをメインのPython環境として使用したい場合:
選択肢1を選ぶことで、全ての環境でRyeのPythonを使用できます。

既存のPython環境を維持したい場合:
選択肢2を選び、Ryeの影響を特定のプロジェクト内に限定します。

結論:

個人的には選択肢２が良いと思っています(無難)。
他の管理ツールを使っていたり、すでにいくつかのプロジェクトがある場合は影響があるかもしれません。
よく分からなかったら、選択肢２を使いましょう（筆者は責任を取りませんが）。

</div></details>

あとは、yesって感じで進んでいきます。

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

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

Details:
  Rye Version: 0.41.0
  Platform: macos (aarch64)

✔ Continue? · yes
✔ What should running `python` or `python3` do when you are not inside a Rye managed project? · Run the old default Python (provided by your OS, pyenv, etc.)
Installed binary to /Users/user_name/.rye/shims/rye
Updated self-python installation at /Users/user_name/.rye/self

The rye directory /Users/user_name/.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"

To make it work with zsh, you might need to add this to your .zprofile:

    source "$HOME/.rye/env"

For more information read https://rye.astral.sh/guide/installation/

All done!
```

これでインストール完了です。
上記出力内で支持されている通り、下記コマンドを実行してパスを通しておきます。

```bash
source "$HOME/.rye/env"
```

最後にインストールが完了しているかを確認するために、下記コマンドを実行します。

```bash
rye self update
```

基本的には最新版が入っていると思いますが、ryeのアップデートをしてくれます。

```bash
Updating to latest
Checking checksum
Validate updated installation
Initializing new virtualenv in /private/var/folders/lb/bgmvtswx3_9grzmg2lxvrd1h0000gn/T/.tmpG3vl0y/.venv
Python version: cpython@3.12.6
Updated!

rye 0.41.0
commit: 0.41.0 (10d691d16 2024-09-29)
platform: macos (aarch64)
self-python: cpython@3.12.6
symlink support: true
uv enabled: true
```

## プロジェクトの作成・初期化

すでにプロジェクトディレクトリがある場合は、ディレクトリに移動して下記を実行します。

```bash
rye init
```

そうすると、必要なものが勝手に作成されます。

これからプロジェクトディレクトリを作成する場合は下記コマンドになります。
今回はmyprojectnameという名前でやっています。

```bash
rye init myprojestname
```

### Pythonのバージョン指定

Pythonのバージョン指定コマンド

```bash
rye pin 3.12.6
```

最初は下記のようなエラーが出るかもしれません。

```bash
$ rye pin python@3.12.6
error: unsupported/unknown version for this platform
```

必要なPythonのバージョンがインストールされていないというエラーのようです。
そこでRyeで使用可能なPythonのバージョンを確認します、
下記コマンドでインストール可能なPython一覧を取得できます。

```bash
$ rye toolchain list --include-downloadable
cpython@3.12.6 (/Users/user_name/.rye/py/cpython@3.12.6/bin/python3)
cpython-x86_64@3.12.6 (downloadable)
cpython-x86_64@3.12.5 (downloadable)
cpython-x86_64@3.12.4 (downloadable)
cpython-x86_64@3.12.3 (downloadable)
cpython-x86_64@3.12.2 (downloadable)
cpython-x86_64@3.12.1 (downloadable)
cpython-x86_64@3.12.0 (downloadable)
cpython-x86_64@3.11.10 (downloadable)
cpython-x86_64@3.11.9 (downloadable)
cpython-x86_64@3.11.8 (downloadable)
cpython-x86_64@3.11.7 (downloadable)
cpython-x86_64@3.11.6 (downloadable)
cpython-x86_64@3.11.5 (downloadable)
cpython-x86_64@3.11.4 (downloadable)
cpython-x86_64@3.11.3 (downloadable)
cpython-x86_64@3.11.1 (downloadable)
cpython-x86_64@3.10.15 (downloadable)
cpython-x86_64@3.10.14 (downloadable)
cpython-x86_64@3.10.13 (downloadable)
cpython-x86_64@3.10.12 (downloadable)
cpython-x86_64@3.10.11 (downloadable)
cpython-x86_64@3.10.9 (downloadable)
cpython-x86_64@3.10.8 (downloadable)
cpython-x86_64@3.10.7 (downloadable)
cpython-x86_64@3.10.6 (downloadable)
cpython-x86_64@3.10.5 (downloadable)
cpython-x86_64@3.10.4 (downloadable)
cpython-x86_64@3.10.3 (downloadable)
cpython-x86_64@3.10.2 (downloadable)
cpython-x86_64@3.10.0 (downloadable)
cpython-x86_64@3.9.20 (downloadable)
cpython-x86_64@3.9.19 (downloadable)
cpython-x86_64@3.9.18 (downloadable)
cpython-x86_64@3.9.17 (downloadable)
cpython-x86_64@3.9.16 (downloadable)
cpython-x86_64@3.9.15 (downloadable)
cpython-x86_64@3.9.14 (downloadable)
cpython-x86_64@3.9.13 (downloadable)
cpython-x86_64@3.9.12 (downloadable)
cpython-x86_64@3.9.11 (downloadable)
cpython-x86_64@3.9.10 (downloadable)
cpython-x86_64@3.9.7 (downloadable)
cpython-x86_64@3.9.6 (downloadable)
cpython-x86_64@3.9.5 (downloadable)
cpython-x86_64@3.9.4 (downloadable)
cpython-x86_64@3.9.3 (downloadable)
cpython-x86_64@3.9.2 (downloadable)
cpython-x86_64@3.9.1 (downloadable)
cpython-x86_64@3.9.0 (downloadable)
cpython-x86_64@3.8.20 (downloadable)
cpython-x86_64@3.8.19 (downloadable)
cpython-x86_64@3.8.18 (downloadable)
cpython-x86_64@3.8.17 (downloadable)
cpython-x86_64@3.8.16 (downloadable)
cpython-x86_64@3.8.15 (downloadable)
cpython-x86_64@3.8.14 (downloadable)
cpython-x86_64@3.8.13 (downloadable)
cpython-x86_64@3.8.12 (downloadable)
cpython-x86_64@3.8.11 (downloadable)
cpython-x86_64@3.8.10 (downloadable)
cpython-x86_64@3.8.9 (downloadable)
cpython-x86_64@3.8.8 (downloadable)
cpython-x86_64@3.8.7 (downloadable)
cpython-x86_64@3.8.6 (downloadable)
cpython-x86_64@3.8.5 (downloadable)
cpython-x86_64@3.8.3 (downloadable)
cpython-x86_64@3.8.2 (downloadable)
cpython-x86_64@3.7.9 (downloadable)
cpython-x86_64@3.7.7 (downloadable)
cpython-x86_64@3.7.6 (downloadable)
cpython-x86_64@3.7.5 (downloadable)
cpython-x86_64@3.7.4 (downloadable)
cpython-x86_64@3.7.3 (downloadable)
cpython@3.12.5 (downloadable)
cpython@3.12.4 (downloadable)
cpython@3.12.3 (downloadable)
cpython@3.12.2 (downloadable)
cpython@3.12.1 (downloadable)
cpython@3.12.0 (downloadable)
cpython@3.11.10 (downloadable)
cpython@3.11.9 (downloadable)
cpython@3.11.8 (downloadable)
cpython@3.11.7 (downloadable)
cpython@3.11.6 (downloadable)
cpython@3.11.5 (downloadable)
cpython@3.11.4 (downloadable)
cpython@3.11.3 (downloadable)
cpython@3.11.1 (downloadable)
cpython@3.10.15 (downloadable)
cpython@3.10.14 (downloadable)
cpython@3.10.13 (downloadable)
cpython@3.10.12 (downloadable)
cpython@3.10.11 (downloadable)
cpython@3.10.9 (downloadable)
cpython@3.10.8 (downloadable)
cpython@3.10.7 (downloadable)
cpython@3.10.6 (downloadable)
cpython@3.10.5 (downloadable)
cpython@3.10.4 (downloadable)
cpython@3.10.3 (downloadable)
cpython@3.10.2 (downloadable)
cpython@3.10.0 (downloadable)
cpython@3.9.20 (downloadable)
cpython@3.9.19 (downloadable)
cpython@3.9.18 (downloadable)
cpython@3.9.17 (downloadable)
cpython@3.9.16 (downloadable)
cpython@3.9.15 (downloadable)
cpython@3.9.14 (downloadable)
cpython@3.9.13 (downloadable)
cpython@3.9.12 (downloadable)
cpython@3.9.11 (downloadable)
cpython@3.9.10 (downloadable)
cpython@3.9.7 (downloadable)
cpython@3.9.6 (downloadable)
cpython@3.9.5 (downloadable)
cpython@3.9.4 (downloadable)
cpython@3.9.3 (downloadable)
cpython@3.9.2 (downloadable)
cpython@3.8.20 (downloadable)
cpython@3.8.19 (downloadable)
cpython@3.8.18 (downloadable)
cpython@3.8.17 (downloadable)
cpython@3.8.16 (downloadable)
cpython@3.8.15 (downloadable)
cpython@3.8.14 (downloadable)
cpython@3.8.13 (downloadable)
cpython@3.8.12 (downloadable)
pypy-x86_64@3.10.14 (downloadable)
pypy-x86_64@3.10.13 (downloadable)
pypy-x86_64@3.10.12 (downloadable)
pypy-x86_64@3.9.19 (downloadable)
pypy-x86_64@3.9.18 (downloadable)
pypy-x86_64@3.9.17 (downloadable)
pypy-x86_64@3.9.16 (downloadable)
pypy-x86_64@3.9.15 (downloadable)
pypy-x86_64@3.9.12 (downloadable)
pypy-x86_64@3.9.10 (downloadable)
pypy-x86_64@3.8.16 (downloadable)
pypy-x86_64@3.8.15 (downloadable)
pypy-x86_64@3.8.13 (downloadable)
pypy-x86_64@3.8.12 (downloadable)
pypy-x86_64@3.7.13 (downloadable)
pypy-x86_64@3.7.12 (downloadable)
pypy-x86_64@3.7.10 (downloadable)
pypy-x86_64@3.7.9 (downloadable)
pypy@3.10.14 (downloadable)
pypy@3.10.13 (downloadable)
pypy@3.10.12 (downloadable)
pypy@3.9.19 (downloadable)
pypy@3.9.18 (downloadable)
pypy@3.9.17 (downloadable)
pypy@3.9.16 (downloadable)
pypy@3.9.15 (downloadable)
pypy@3.8.16 (downloadable)
pypy@3.8.15 (downloadable)
```

この中からPythonのバージョンを選べるようです。

```bash
rye pin cpython-x86_64@3.12.6
```

これでPythonのバージョンの指定をできます。
ただこのコマンドは仮想環境の設定などが記載されているファイルが変更されるだけで、その変更を反映させる必要があるため下記コマンドを実行します。

```bash
rye sync
```

最初はPythonダウンロードがありますが、すぐに終わります。

### おまけ

事前にPythonのバージョンを指定して、ダウンロードすることも可能です。
下記コマンドでインストール可能です。
他のバージョンを使用したい方は、バージョンの部分を適宜書き換えてください。

```bash
$ rye toolchain fetch cpython-x86_64@3.12.6
Downloading cpython-x86_64@3.12.6
Checking checksum
Unpacking
Downloaded cpython-x86_64@3.12.6
```

## パッケージの追加

パッケージの追加は下記コマンドです

```bash
rye add パッケージ名

rye add pandas
```

パッケージのバージョンを指定したい場合

```bash
rye add "パッケージ名==0.0.0"

rye add pandas==2.2.3
```

パッケージの削除をしたい場合

```bash
rye remove パッケージ名

rye remove pandas
```

パッケージの追加、変更、削除などの操作を反映させるためにも、同期を忘れないでください。

```bash
rye sync
```

## 仮想環境での実行・入る

実行するためには下記のコマンド

```bash
rye run python main.py
```

仮想環境に入るコマンド

```bash
source .venv/bin/activate
```

仮想環境を修了するコマンド

```bash
deactivate
```

## 最後に

Ryeを使うのは意外と簡単でした。
個人開発や趣味の範囲であれば十分かなと思いました。

以前はAnacondaを使用していて、初心者には良かったですが一部使えないライブラリなどがあり使いづらかったです。
Anacondaは有料版もありそちらは、ライブラリのライセンス確認してくれたり結構いいらしいのですが、個人開発レベルではどうなのかと思っていました。

仕事ではPoetryなどを使っていますが、PoetryがPythonのバージョン管理をpyenvを使っていたので、
Ryeでワンストップでできるのは便利でした。

初学者や独学者にとって、この辺は鬼門の1つなので少しでも参考になればと思います。