升级

当新版 Loco 发布时该怎么做?

  • 在你的代码仓库中创建一个干净的分支。
  • 更新你的主 Cargo.toml 文件中的 Loco 版本。
  • 参考 CHANGELOG 查找破坏性变更以及你应该做的重构(如果有的话)。
  • 在你的项目中运行 cargo loco doctor 以验证你的应用和环境与新版本兼容

和往常一样,如果出现任何问题,提交 issue 并寻求帮助。

主要的 Loco 依赖

Loco 构建于优秀的库之上。关注 Loco 新版本中这些库的版本以及它们各自的更新日志是明智的。

以下是主要的依赖库:

从 0.13.x 升级到 0.14.x

从 Axum 0.7 升级到 0.8

PR: #1130 升级到 Axum 0.8 引入了一个破坏性变更。更多详情,请参考 公告

升级步骤

  • 在你的 Cargo.toml 文件中,将 Axum 版本从 0.7.5 更新到 0.8.1
  • use axum::async_trait; 替换为 use async_trait::async_trait;。 更多信息,请查看这里
  • URL 参数语法已更改。 参考此部分 了解更新后的语法。 新的路径参数格式为: 路径参数语法已从 /:single/*many 更改为 /{single}/{*many}

扩展 boot 函数 Hook

PR: #1143

boot hook 函数现在接受一个额外的 Config 参数。 函数签名已从以下形式更改:

async fn boot(mode: StartMode, environment: &Environment) -> Result<BootResult> {
     create_app::<Self, Migrator>(mode, environment).await
}

到:

async fn boot(mode: StartMode, environment: &Environment, config: Config) -> Result<BootResult> {
     create_app::<Self, Migrator>(mode, environment, config).await
}

请确保根据需要导入 Config 类型。

升级 validator crate

PR: #993

更新你的 Cargo.toml 文件中的 validator crate 版本:

validator = { version = "0.18" }

validator = { version = "0.19" }

扩展 truncate 和 seed hooks

PR: #1158

truncateseed 函数现在接收 AppContext 而不是 DatabaseConnection 作为它们的参数。

async fn truncate(db: &DatabaseConnection) -> Result<()> {}
async fn seed(db: &DatabaseConnection, base: &Path) -> Result<()> {}

async fn truncate(ctx: &AppContext) -> Result<()> {}
async fn seed(_ctx: &AppContext, base: &Path) -> Result<()> {}

对测试的影响:

涉及 seed 函数的测试代码也必须相应地更新。

从:

async fn load_page() {
    request::<App, _, _>(|request, ctx| async move {
        seed::<App>(&ctx.db).await.unwrap();
        ...
    })
    .await;
}

async fn load_page() {
    request::<App, _, _>(|request, ctx| async move {
        seed::<App>(&ctx).await.unwrap();
        ...
    })
    .await;
}