Auto-build the fronted into the release binary on cargo build --release

This commit is contained in:
Dave
2026-02-16 17:05:09 +00:00
parent dae772e619
commit 37be55242d
2 changed files with 40 additions and 28 deletions

View File

@@ -3,30 +3,28 @@
This app runs as a single Rust web server binary that serves the Vite/React frontend and exposes APIs. This app runs as a single Rust web server binary that serves the Vite/React frontend and exposes APIs.
The frontend lives in the `frontend/` directory. The frontend lives in the `frontend/` directory.
You can also run the frontend and backend separately in development (Vite dev server + Rust API).
## Running it in development ## Running it in development
```bash ```bash
# Build the frontend # Build the frontend
cd frontend cd frontend
pnpm install pnpm install
pnpm build pnpm dev
cd ..
# Run the server (serves embedded frontend/dist/) # Run the server (serves embedded frontend/dist/)
cargo run cargo run
``` ```
## Running it in production ## Production
```bash ```bash
# Build the frontend # Build the release binary (also builds the frontend via build.rs)
cd frontend cargo build --release
pnpm install
pnpm build
cd ..
# Run the server (serves embedded frontend/dist/) # Run the server (serves embedded frontend/dist/)
cargo run ./target/release/story-kit-server
``` ```

View File

@@ -1,23 +1,37 @@
use std::fs; use std::env;
use std::path::Path; use std::path::Path;
use std::process::Command;
fn run(cmd: &str, args: &[&str], dir: &Path) {
let status = Command::new(cmd)
.args(args)
.current_dir(dir)
.status()
.unwrap_or_else(|e| panic!("Failed to run {} {:?}: {}", cmd, args, e));
if !status.success() {
panic!("Command failed: {} {:?}", cmd, args);
}
}
fn main() { fn main() {
let dist_dir = Path::new("../frontend/dist");
println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=PROFILE");
println!("cargo:rerun-if-changed=../frontend/package.json");
println!("cargo:rerun-if-changed=../frontend/pnpm-lock.yaml");
println!("cargo:rerun-if-changed=../frontend/vite.config.ts");
println!("cargo:rerun-if-changed=../frontend/index.html");
println!("cargo:rerun-if-changed=../frontend/src");
println!("cargo:rerun-if-changed=../frontend/public");
if let Ok(entries) = fs::read_dir(dist_dir) { let profile = env::var("PROFILE").unwrap_or_default();
for entry in entries.flatten() { if profile != "release" {
let path = entry.path(); return;
if path.is_dir() {
if let Ok(sub_entries) = fs::read_dir(&path) {
for sub_entry in sub_entries.flatten() {
println!("cargo:rerun-if-changed={}", sub_entry.path().display());
}
}
} else {
println!("cargo:rerun-if-changed={}", path.display());
}
}
} }
let frontend_dir = Path::new("../frontend");
// Ensure dependencies are installed and build the frontend bundle.
run("pnpm", &["install"], frontend_dir);
run("pnpm", &["build"], frontend_dir);
} }