From 2fe717cb6218689faeafbdefb50f2354bdba3adf Mon Sep 17 00:00:00 2001 From: jkooe <62494645+jkooe@users.noreply.github.com> Date: Sat, 10 Oct 2026 15:33:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BF=AE=20clippy=20=E7=9A=84?= =?UTF-8?q?=E4=B8=A4=E4=B8=AA=E9=94=99=E8=AF=AF=EF=BC=88=E5=90=AB=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=9C=9F=E5=AE=9E=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=89+=20=E6=9C=AC=E5=9C=B0=E8=A1=A5=E9=BD=90=20lint=20?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## CI 失败的真实原因(上一轮我误判为 resources,实为 clippy) `-D warnings` 下两个错误: 1. **`clippy::await_holding_lock`(sidecar.rs,真问题)**: `if let Some(child) = self.child.lock().unwrap().take() { child.kill().await }` —— MutexGuard 存活到 if 块结束,**跨 await 持有 std Mutex**:不仅触发 lint, 真会阻塞 executor。已改为「先取出 child(锁随即释放),再 await kill」。 2. `clippy::doc_lazy_continuation`(lib.rs 文档注释):列表与后续段落之间缺空行。 ## 我的验证方式错在哪(已修正) 上一轮我本地只跑 `cargo test`,**没跑 clippy** —— 而 CI 是 `clippy -D warnings` + `test` 两道闸。本地与 CI **标准不一致**,于是"本地绿、CI 红"。 本轮起:**本地按 CI 的完整命令集验证**(clippy --all-targets -- -D warnings → cargo test)。 ## 验证 - `cargo clippy --all-targets -- -D warnings` → **零警告** - `cargo test` → **3/3 通过** --- apps/console/src-tauri/src/lib.rs | 1 + apps/console/src-tauri/src/sidecar.rs | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/console/src-tauri/src/lib.rs b/apps/console/src-tauri/src/lib.rs index d6beaee..c0dd825 100644 --- a/apps/console/src-tauri/src/lib.rs +++ b/apps/console/src-tauri/src/lib.rs @@ -6,6 +6,7 @@ //! //! command 面(**签名与语义保持不变,前端无需改动**): //! - `connect` / `disconnect` / `invoke_capability` / `get_capabilities` / `get_state` +//! //! Tauri 事件面(名字不变):`na-state` / `na-log` / `na-event`。 mod sidecar; diff --git a/apps/console/src-tauri/src/sidecar.rs b/apps/console/src-tauri/src/sidecar.rs index 9a42e4e..a0b15f6 100644 --- a/apps/console/src-tauri/src/sidecar.rs +++ b/apps/console/src-tauri/src/sidecar.rs @@ -172,7 +172,12 @@ impl Sidecar { /// 关掉 sidecar(app 退出或显式 disconnect 时调用)。 pub async fn shutdown(&self) { let _ = self.request("disconnect", json!({}), 5).await; - if let Some(mut child) = self.child.lock().unwrap().take() { + // ⚠️ 必须**先把 child 取出来、让锁离开作用域**,再 await kill()。 + // 若写成 `if let Some(child) = self.child.lock().unwrap().take() { child.kill().await }`, + // MutexGuard 会存活到 if 块结束 → 跨 await 持有 std Mutex(clippy::await_holding_lock, + // 且真会阻塞 executor)。 + let child = self.child.lock().unwrap().take(); + if let Some(mut child) = child { let _ = child.kill().await; } }