64 lines
2.1 KiB
Rust
64 lines
2.1 KiB
Rust
use std::path::Path;
|
|
use std::process::Command;
|
|
|
|
fn run_npm(args: &[&str], web_dir: &Path) {
|
|
let is_windows = cfg!(target_os = "windows");
|
|
|
|
if is_windows {
|
|
let mut cmd_args = vec!["/c", "npm"];
|
|
cmd_args.extend_from_slice(args);
|
|
let status = Command::new("cmd")
|
|
.args(&cmd_args)
|
|
.current_dir(web_dir)
|
|
.status()
|
|
.unwrap_or_else(|e| panic!("failed to spawn npm {}: {}", args.join(" "), e));
|
|
|
|
if !status.success() {
|
|
panic!("npm {} failed with status {}", args.join(" "), status);
|
|
}
|
|
} else {
|
|
let status = Command::new("npm")
|
|
.args(args)
|
|
.current_dir(web_dir)
|
|
.status()
|
|
.unwrap_or_else(|e| panic!("failed to spawn npm {}: {}", args.join(" "), e));
|
|
|
|
if !status.success() {
|
|
panic!("npm {} failed with status {}", args.join(" "), status);
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
println!("cargo:rerun-if-env-changed=SKIP_FRONTEND_BUILD");
|
|
|
|
let web_dir = Path::new("web");
|
|
if web_dir.exists() {
|
|
println!("cargo:rerun-if-changed=web/src");
|
|
println!("cargo:rerun-if-changed=web/index.html");
|
|
println!("cargo:rerun-if-changed=web/package.json");
|
|
println!("cargo:rerun-if-changed=web/vite.config.ts");
|
|
println!("cargo:rerun-if-changed=web/tailwind.config.js");
|
|
println!("cargo:rerun-if-changed=web/postcss.config.js");
|
|
println!("cargo:rerun-if-changed=web/tsconfig.json");
|
|
}
|
|
|
|
if std::env::var("SKIP_FRONTEND_BUILD").is_ok() {
|
|
println!("cargo:warning=SKIP_FRONTEND_BUILD is set, skipping frontend build");
|
|
return;
|
|
}
|
|
|
|
if !web_dir.exists() {
|
|
println!("cargo:warning=web/ directory not found, skipping frontend build");
|
|
return;
|
|
}
|
|
|
|
println!("cargo:warning=building frontend (npm install)...");
|
|
run_npm(&["install"], web_dir);
|
|
|
|
println!("cargo:warning=building frontend (npm run build)...");
|
|
run_npm(&["run", "build"], web_dir);
|
|
|
|
println!("cargo:warning=frontend build complete, output in static/");
|
|
}
|