// build.rs use std::process::Command; use std::path::Path; fn main() { // 声明:只有当 dashboard/src/ 目录或 build.rs 发生改变时,才重新触发构建脚本 println!("cargo:rerun-if-changed=dashboard/src"); println!("cargo:rerun-if-changed=dashboard/package.json"); println!("cargo:rerun-if-changed=build.rs"); let dashboard_dir = Path::new("dashboard"); let node_modules_exist = dashboard_dir.join("node_modules").exists(); let dist_exists = dashboard_dir.join("dist").exists(); // 1. 如果没有 node_modules,自动运行 npm install if !node_modules_exist { println!("cargo:warning=未检测到 node_modules,正在自动为您安装前端依赖 (npm install)..."); let status = Command::new("npm") .arg("install") .current_dir(dashboard_dir) .status(); match status { Ok(s) if s.success() => { println!("cargo:warning=前端依赖安装成功。"); } _ => { panic!("错误: 自动执行 npm install 失败,请检查是否安装了 Node.js / npm 并配置了正确的环境变量。"); } } } // 2. 如果 dist 目录不存在,或者检测到前端源码变化,自动运行 npm run build // 提示:因为上面 rerun-if-changed 绑定了 src 目录,只有 src 变动或者 dist 不存在时才会走到这步 if !dist_exists || node_modules_exist { println!("cargo:warning=正在自动为您构建前端静态资源 (npm run build)..."); let status = Command::new("npm") .arg("run") .arg("build") .current_dir(dashboard_dir) .status(); match status { Ok(s) if s.success() => { println!("cargo:warning=前端资源构建打包成功。"); } _ => { panic!("错误: 自动构建前端静态资源失败 (npm run build),请进入 dashboard 目录手动排查编译错误。"); } } } }