之前尝试了 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 的默认页面。
查看初始化的数据库结构
默认有三张数据库表:
> 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).
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式