rust web 框架 loco 安装

文章目录

    之前尝试了 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).
    

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式