rust web 框架 loco 安装

更新日期: 2024-04-28 阅读次数: 397 字数: 742 分类: rust

之前尝试了 rust 的 Axum 框架,并写了两个练手的小工具。但是感觉上还是太简陋了,跟 golang 的 gin 类似, 没有自带的 ORM 以及模板系统,对初学者非常不友好。

我需要的是一个类似 Laravel 这样的完善的框架,有自己的代码结构规范,以及各种内置功能。

恰好看到了 loco 这个框架,号称对标 Ruby on Rails 这个经典框架。

Loco is a Rails inspired web framework for Rust.

而且是基于 Axum 的封装。于是忍不住想尝试一下,顺便把之前写的小工具重构成基于 Loco 的。

安装 loco

cargo install loco-cli
cargo install sea-orm-cli

其中,sea orm 是 loco 内置的 ORM。

新建项目

> loco new

✔ ❯ App name? · loco_tool
✔ ❯ What would you like to build? · SaaS app (with DB and user auth)

🚂 Loco app generated successfully in:
/mnt/d/work/loco_tool

其中 loco_tool 是项目名称,loco 会自动新建一个同名目录,并从 github 上下载一套脚手架代码。

启动项目

cargo loco start

由于 loco 默认使用的是 postgresql 数据库,如果本地没有 postgresql 数据库,则会启动失败,并报错:

Error: Connection Error: pool timed out while waiting for an open connection

Caused by:
   0: pool timed out while waiting for an open connection
   1: pool timed out while waiting for an open connection

修改默认数据库为 sqlite

对于没有什么用户量的小项目,用 sqlite 足够了。

修改方法:

打开配置文件 config/development.yaml.

搜索 database 配置,将数据库连接字符串改为 sqlite 配置。

# Database Configuration
database:
  # Database connection URI
  #uri: {{get_env(name="DATABASE_URL", default="postgres://loco:loco@localhost:5432/loco_tool_development")}}
  uri: {{get_env(name="DATABASE_URL", default="sqlite://./db.sqlite?mode=rwc")}}

再次启动 loco 服务:

cargo loco start

通过

http://localhost:3000

即可看到 loco 的默认页面。

rust loco hello world

查看初始化的数据库结构

默认有三张数据库表:

> sqlite3 db.sqlite 

sqlite> .tables
notes             seaql_migrations       users

sqlite> select * from users;
sqlite> select * from notes;

sqlite> select * from seaql_migrations ;
m20220101_000001_users|1714202440
m20231103_114510_notes|1714202440

sqlite>

依赖这么多,编译后的二进制文件大小

之前使用 axum 写一个 hello world,release build 后的二进制文件大小为 8.5M。

而 loco 在安装过程中,我发现安装的依赖非常多,完全不亚于一个垃圾 js 前端项目。 执行编译:

$ cargo build --release

可以看到 target/release/ 目录下生成的最终文件有 32M。

git 错误

第一次执行 loco new 时,报了一个 git 的错误,我感觉是 loco 的 bug。 因为新建项目跟 git 应该没有任何关系。

> loco new

2024-04-27T03:41:21.986215Z ERROR loco_cli::git: git command returned an error error=Output { status: ExitStatus(unix_wait_status(32768)), stdout: "", stderr: "fatal: not a git repository (or any parent up to mount point /mnt)\nStopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).\n" }
✔ ❯ App name? · loco_tool
🙀 No such file or directory (os error 2)

这个错误跟,本地执行 git status 返回的错误一样。

> git status
fatal: not a git repository (or any parent up to mount point /mnt)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

tags: loco

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式