From 8edfd080958593c382193e40802b37b65f03eb99 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 25 Apr 2026 13:32:20 +0800 Subject: [PATCH] fix: align rust workspace build scope --- docs/technical/README.md | 2 +- ...PACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md | 39 +++++++++++++++++++ server-rs/Cargo.toml | 3 ++ .../src/character_animation_assets.rs | 5 --- .../crates/module-custom-world/src/lib.rs | 2 + .../crates/spacetime-module/src/puzzle.rs | 3 ++ 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 docs/technical/RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md diff --git a/docs/technical/README.md b/docs/technical/README.md index 296d9fe6..33314d47 100644 --- a/docs/technical/README.md +++ b/docs/technical/README.md @@ -5,6 +5,7 @@ ## 文档列表 - [BIG_FISH_DIRECTION_TOUCH_CONTROL_2026-04-24.md](./BIG_FISH_DIRECTION_TOUCH_CONTROL_2026-04-24.md):记录大鱼吃小鱼从固定摇杆改为屏幕首触点方向控制,并要求本地直达局在未操作时保持对象运动。 +- [RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md](./RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md):记录 `server-rs` 无参数 `cargo build` 链接 `spacetime-module` 失败的根因,并冻结默认只构建原生 `api-server`、模块产物继续走 `spacetime build` 的命令边界。 - [BIG_FISH_DIRECT_ROUTE_PLAYGROUND_2026-04-24.md](./BIG_FISH_DIRECT_ROUTE_PLAYGROUND_2026-04-24.md):记录 `/big-fish` 大鱼吃小鱼玩法直达入口,明确复用现有 `BigFishRuntimeShell` 和本地占位运行态的调试边界。 - [PUZZLE_DIRECT_ROUTE_PLAYGROUND_2026-04-24.md](./PUZZLE_DIRECT_ROUTE_PLAYGROUND_2026-04-24.md):记录 `/puzzle` 拼图玩法直达入口,明确复用现有 `PuzzleRuntimeShell` 和本地占位图运行态的调试边界。 - [CREATION_AGENT_PUBLISH_GATE_NORMALIZE_WRITEBACK_FIX_2026-04-24.md](./CREATION_AGENT_PUBLISH_GATE_NORMALIZE_WRITEBACK_FIX_2026-04-24.md):记录结果页 profile 归一化回写丢失顶层 `worldHook / playerPremise` 导致 publish gate 继续误报结构 blocker 的根因,并冻结前端归一化保留发布字段的修复口径。 @@ -165,4 +166,3 @@ - 做阶段排期时,把这一组和 `docs/planning/`、`docs/prd/` 一起看,更容易判断先后顺序。 - diff --git a/docs/technical/RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md b/docs/technical/RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md new file mode 100644 index 00000000..dc64f65a --- /dev/null +++ b/docs/technical/RUST_WORKSPACE_DEFAULT_BUILD_SCOPE_FIX_2026-04-25.md @@ -0,0 +1,39 @@ +# Rust Workspace 默认构建范围修复(2026-04-25) + +## 背景 + +`server-rs` 同时包含原生运行的 `api-server` 与只应由 SpacetimeDB CLI 按 wasm 模块方式构建的 `spacetime-module`。 + +直接在 `server-rs` 下执行无参数 `cargo build` 时,Cargo 会尝试构建 workspace 的全部成员,其中 `spacetime-module` 是 `cdylib`,并依赖 `spacetimedb` 模块运行时导入函数。该 crate 不能作为 Windows 原生 DLL 链接,链接阶段会报 `LNK2019 unresolved external symbol`,例如 `datastore_insert_bsatn`、`console_log`、`table_id_from_name`。 + +## 决策 + +1. `cargo build` 默认只构建原生服务入口 `api-server`。 +2. `spacetime-module` 保留为 workspace member,便于 `cargo check --workspace --all-targets` 做类型检查。 +3. `spacetime-module` 的可发布产物必须继续通过 SpacetimeDB CLI 构建,不走无参数 `cargo build` 的原生链接路径。 + +## 落地 + +在 `server-rs/Cargo.toml` 增加: + +```toml +[workspace] +default-members = [ + "crates/api-server", +] +``` + +## 验证命令 + +```powershell +cd D:\Genarrative\server-rs +cargo build +cargo check --workspace --all-targets +spacetime build --module-path crates/spacetime-module +``` + +## 后续约束 + +- 日常本地编译原生后端用 `cargo build` 或 `cargo build -p api-server`。 +- 验证全部 Rust 目标用 `cargo check --workspace --all-targets`。 +- 构建 / 发布 SpacetimeDB 模块用 `spacetime build --module-path crates/spacetime-module` 或发布脚本,不要用原生 `cargo build -p spacetime-module`。 diff --git a/server-rs/Cargo.toml b/server-rs/Cargo.toml index ce63588a..821314f0 100644 --- a/server-rs/Cargo.toml +++ b/server-rs/Cargo.toml @@ -3,6 +3,9 @@ [workspace] resolver = "2" +default-members = [ + "crates/api-server", +] members = [ "crates/api-server", "crates/module-ai", diff --git a/server-rs/crates/api-server/src/character_animation_assets.rs b/server-rs/crates/api-server/src/character_animation_assets.rs index 3dbafcaa..288eafee 100644 --- a/server-rs/crates/api-server/src/character_animation_assets.rs +++ b/server-rs/crates/api-server/src/character_animation_assets.rs @@ -3432,11 +3432,6 @@ mod tests { } #[test] - pub(crate) fn find_motion_template(id: &str) -> Option<&'static MotionTemplate> { - BUILT_IN_MOTION_TEMPLATES - .iter() - .find(|template| template.id == id.trim()) - } fn resolve_character_animation_model_uses_strategy_specific_field() { let payload = CharacterAnimationGenerateRequest { character_id: "hero".to_string(), diff --git a/server-rs/crates/module-custom-world/src/lib.rs b/server-rs/crates/module-custom-world/src/lib.rs index a99a8091..9d8fe120 100644 --- a/server-rs/crates/module-custom-world/src/lib.rs +++ b/server-rs/crates/module-custom-world/src/lib.rs @@ -1775,6 +1775,8 @@ mod tests { let error = validate_custom_world_profile_upsert_input(&CustomWorldProfileUpsertInput { profile_id: "cwprof_001".to_string(), owner_user_id: "user_001".to_string(), + public_work_code: None, + author_public_user_code: None, source_agent_session_id: None, world_name: "裂潮边城".to_string(), subtitle: "港口余烬".to_string(), diff --git a/server-rs/crates/spacetime-module/src/puzzle.rs b/server-rs/crates/spacetime-module/src/puzzle.rs index ce285c7b..f6a0fa14 100644 --- a/server-rs/crates/spacetime-module/src/puzzle.rs +++ b/server-rs/crates/spacetime-module/src/puzzle.rs @@ -1573,6 +1573,9 @@ fn deserialize_run(value: &str) -> Result { #[cfg(test)] mod tests { use super::*; + use module_puzzle::{ + build_generated_candidates, empty_anchor_pack, recommendation_score, tag_similarity_score, + }; #[test] fn puzzle_json_round_trip_keeps_snapshot_shape() {