Rust on Rails!? Rust 版の Rails と呼ばれる "Loco" を試す!
Rust 版 Rails "Loco"
Loco は Rails にインスパイアされた Rust の比較的新しい Web フレームワークです。
2024 年 9 月 1 日時点でバージョン 0.8.0 がリリースされています。
Loco の特徴
タイトルにもある通り、Loco is Rust on Rails. [1] を謳っており、
Ruby on Rails の開発体験の良さを Rust でも再現しようとしています。
また、小さいサービスや個人開発に適したフルスタックフレームワークとして開発されているようです。
内部実装では、コントローラーやルーティングは Axum で実装されていたり、
ActiveRecord は SeaORM で実装されていたりするそうです。[2]
Axum や SeaORM については、別の記事で触れているので良ければご覧ください!
Why not Rails?
Rails を使えば良いじゃん! という問いに、
What if Rails was Built on Rust? というブログで次のように答えています。
Ruby に満足しているなら、Rails を使用してください。
でも、Rust が好きなら、Loco を使用してください。
Loco を使用することで Rust が持つ安全性や強力な型システムなどのメリットを享受できます。
クイックスタート
A Quick Tour with Loco に従って、Loco を試してみます!
loco new でプロジェクトを作成する
CLI で操作しながら開発を進めるために、まず loco-cli
をインストールします。
また、上述したように SeaORM も使われているので sea-orm-cli
もインストールしておきます。
cargo install loco-cli
cargo install sea-orm-cli
以下のコマンドでプロジェクトを作成します!
loco new
対話式になっているので、必要な情報を入力していきます。
今回、アプリケーションのタイプは SaaS app を選択します。
✔ ❯ App name? · loco_app
✔ ❯ What would you like to build? · SaaS app (with DB and user auth)
✔ ❯ Select a DB Provider · Postgres
✔ ❯ Select your background worker type · Async
✔ ❯ Select an asset serving configuration · Clientside
アプリを実行する
POSTGRES_DB
の値を loco_app_development
に変更して DB 用のコンテナを立ち上げます。
docker run -d -p 5432:5432 \
-e POSTGRES_USER=loco \
-e POSTGRES_DB=loco_app_development \
-e POSTGRES_PASSWORD="loco" \
postgres:15.3-alpine
以下のコマンドでアプリを実行します。
cargo loco start
トラブルシューティング
最初に cargo loco start
を実行すると、以下のエラーが出ました。
Error: Message("one of the static path are not found, Folder `frontend/dist` fallback: `frontend/dist/index.html`")
frontend フォルダを覗くと、確かに dist が存在しません...。
frontend の README には次のように記載があるので、
pnpm build
を実行後に cargo loco start
を実行すると無事にエラーが解消されました。
(もちろん、pnpm install
も忘れずに。)
After the build
dist
folder is ready to served by loco. run lococargo loco start
and the frontend application will served via Loco
成功すると LOCO が登場します!
▄ ▀
▀ ▄
▄ ▀ ▄ ▄ ▄▀
▄ ▀▄▄
▄ ▀ ▀ ▀▄▀█▄
▀█▄
▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█
██████ █████ ███ █████ ███ █████ ███ ▀█
██████ █████ ███ █████ ▀▀▀ █████ ███ ▄█▄
██████ █████ ███ █████ █████ ███ ████▄
██████ █████ ███ █████ ▄▄▄ █████ ███ █████
██████ █████ ███ ████ ███ █████ ███ ████▀
▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀ ██▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
https://loco.rs
environment: development
database: automigrate
logger: debug
compilation: debug
modes: server
listening on localhost:5150
CRUD API を追加する
posts API
ブログ投稿アプリのバックエンドとして post
を管理する API を追加します。
scaffold
を使って、CRUD API を追加することができます!
cargo loco generate scaffold post title:string content:text
DB を確認すると、posts
テーブルが作成されています。
loco cli で追加された API を確認してみます。
cargo loco routes
[GET] /_health
[GET] /_ping
[POST] /api/auth/forgot
[POST] /api/auth/login
[POST] /api/auth/register
[POST] /api/auth/reset
[POST] /api/auth/verify
[GET] /api/notes
[POST] /api/notes
[GET] /api/notes/:id
[DELETE] /api/notes/:id
[POST] /api/notes/:id
[GET] /api/user/current
[GET] /posts
[POST] /posts
[GET] /posts/:id
[DELETE] /posts/:id
[POST] /posts/:id
次に post
を作成してみます。
curl -X POST -H "Content-Type: application/json" -d '{
"title": "I like sushi.",
"content": "I had sushi for dinner."
}' localhost:5150/posts
作成された post
を取得してみます。
curl localhost:5150/posts
[{"created_at":"2024-09-05T14:37:45.252003Z","updated_at":"2024-09-05T14:37:45.252003Z","id":1,"title":"I like sushi.","content":"I had sushi for dinner."}]
curl localhost:5150/posts/1
{"created_at":"2024-09-05T14:37:45.252003Z","updated_at":"2024-09-05T14:37:45.252003Z","id":1,"title":"I like sushi.","content":"I had sushi for dinner."}
scaffold
コマンドでバックエンドの API を実装することができました。
とてもスピーディですね...🚂🚂🚂
まとめ
ほとんど Ruby on Rails を触ったことがないので本家と違いが分かりませんが、
CLI で操作しながらサクサクと開発を進めることができてとても新鮮でした🤔✨✨
まだ触りの部分しか試せていないので、もう少し触ってみようと思います。
今後もバージョンアップが進むと思うので、期待が膨らみます!!!!
Rust の Web フレームワーク事情も随時チェックしていかなければ...
参考
- RailsライクなRustのWebフレームワーク 「Loco」 | DevelopersIO
- 今話題の Rust Loco 試してみた話
- Introducing Loco: The Rails of Rust
Discussion