升级到 `webx` 导入路径(0.4 → 0.5)
本次迭代把**代码导入路径**从 `rust_webx` 统一为 `webx`,并把 SPA 内嵌改为显式入口。 **Cargo 包名保持不变**(仍是 `rust-webx` / `rust-webx-*`),所以 `Cargo.toml` 的依赖声明 无需改动,只需修改 `use` 路径与嵌入入口。
变更一览
| 项目 | 旧 | 新 | |------|-----|-----| | 伞 crate 导入 | `use rust_webx::*;` | `use webx::*;` | | 子 crate 导入 | `rust_webx_core::…` / `rust_webx_host::…` / `rust_webx_spa::…` / `rust_webx_openapi::…` / `rust_webx_macros::…` | `webx_core::…` / `webx_host::…` / `webx_spa::…` / `webx_openapi::…` / `webx_macros::…` | | 入口宏 | `#[rust_webx::main]` | `#[webx::main]` | | 嵌入宏 | `rust_webx::spa::embed_assets!()` | `webx::spa::embed_assets!()` | | 应用基准目录环境变量 | `RUST_WEBX_APP_BASE` | `WEBX_APP_BASE` | | 内嵌开关环境变量 | `RUST_WEBX_EMBED` | `WEBX_EMBED` | | 构建期 crate | `rust_webx_build::embed_assets("wwwroot")` | `webx::builder().web_root("wwwroot").build()` | | 生成文件 | `rust_webx_embedded_assets.rs` | `webx_embedded_assets.rs` | | Builder 方法 | `.embed()` | 已删除(改由入口宏 / `build.rs` 决定) |
> **包名不动**:`rust-webx`、`rust-webx-core`、`rust-webx-host`、`rust-webx-macros`、 > `rust-webx-spa`、`rust-webx-openapi`、`rust-webx-build`。 > package 名(带连字符)与导入名(下划线)不是一回事,这是 Rust 的常态: > `rust-webx = "0.5"` 提供 `webx::`。
迁移步骤
1. 批量替换标识符
# 只替换下划线形式;包名(带连字符)不受影响
grep -rl 'rust_webx' --include='*.rs' . | xargs sed -i 's/rust_webx_build/webx/g; s/rust_webx/webx/g'
grep -rl 'RUST_WEBX' --include='*.rs' . | xargs sed -i 's/RUST_WEBX/WEBX/g'
(PowerShell:注意 `-replace` 默认大小写不敏感,建议用 `-creplace`。)
2. SPA 内嵌改为显式
**旧写法**
// build.rs
fn main() -> Result<(), rust_webx_build::Error> {
rust_webx_build::embed_assets("wwwroot")
}
// main.rs
rust_webx::spa::embed_assets!(); // crate root
Host::builder().use_spa("wwwroot").embed().build()
**新写法**
// build.rs —— 编译期源树(烤进二进制的目录)
fn main() -> Result<(), webx::Error> {
webx::builder()
.web_root("wwwroot")
.build()
}
// main.rs —— (embed) 明确链接该表
#[webx::main(embed)]
async fn main() {
Host::builder()
.use_spa("wwwroot") // 运行期磁盘覆盖目录
.build()
.run()
.await
.expect("Server failed");
}
三者语义必须分清:
| 符号 | 时机 | 含义 | |------|------|------| | `web_root(...)` | 编译期 | **烤进 bin 的源目录** | | `#[webx::main(embed)]` | 编译期入口 | **确认链接**该表;不写则完全不嵌入 | | `.use_spa("wwwroot")` | 运行期 | **磁盘覆盖目录**(运维可改 favicon 等) |
3. 集成测试
测试进程不执行 `fn main`,用属性宏注册同一张表:
#[webx::embed_assets]
mod __embedded_assets {}
4. 环境变量
部署脚本 / 容器环境变量同步改名:
- `RUST_WEBX_APP_BASE` → `WEBX_APP_BASE` - `RUST_WEBX_EMBED` → `WEBX_EMBED`
验证
cargo check --workspace
cargo test -p rust-webx-build
cargo test -p docbit-host --test e2e_test without_wwwroot
常见问题
| 现象 | 原因 | 处理 | |------|------|------| | `unresolved import webx` | 依赖未升级,或仍在用 `rust_webx` | 升级到 0.5+;把 `use rust_webx::` 换成 `use webx::` | | 编译报「缺少 OUT_DIR 生成文件」 | 写了 `(embed)` 但 `build.rs` 未配 `web_root` | 补 `build.rs`,或去掉 `(embed)` | | `embed() found no compiled-in assets` | 仍在调用已删除的 `.embed()` | 删除该方法调用,见步骤 2 | | 旧资源仍被内嵌 | `OUT_DIR` 中残留旧生成文件 | `cargo clean` 后重建 | | 环境变量不生效 | 仍用 `RUST_WEBX_*` | 改为 `WEBX_*` |
相关文档
- [OpenAPI 与 SPA 托管](../11-production/openapi-spa.md) — 内嵌模型与覆盖顺序 - [Crate 分层结构](../04-architecture/crate-layout.md) — 编译期 crate 的职责