use std::{io, process::Command}; fn main() -> Result<(), io::Error> { // trigger recompilation when a new migration is added println!("cargo::rerun-if-changed=migrations"); // The following sections are intended to allow developers and packagers to create a working // `pilcrow` binary in one step in a clean source tree, using Cargo, even though Pilcrow is // written in two-and-a-half languages. // // The final binary embeds the Svelte UI. These steps build it. And, in service of that one-step // build idea, they also install the NPM dependencies needed to carry out that build. (Cargo // does this out of the box for Rust dependencies.) // rerun npm ci whenever packages or npm config are changed println!("cargo::rerun-if-changed=.npmrc"); println!("cargo::rerun-if-changed=package.json"); println!("cargo::rerun-if-changed=package-lock.json"); // In theory, we should rerun `npm ci` if `node_modules` has changed since the last build, to // put it back into a known-good state. However, `npm ci` itself _always_ rewrites // `node_modules`, so asking Cargo to rerun this build script if `node_modules` changes leads to // Cargo always rerunning this build script. So, as a compromise, we assume that changes to // `package-lock.json` or `package.json` are sufficient justification to rerun `npm ci`, because // those are the most likely secondary indicators of changes to the installed packages. // // println!("cargo::rerun-if-changed=node_modules"); let status = Command::new("npm").args(["ci"]).status()?; if !status.success() { return Err(io::Error::other(format!( "'npm ci' exited with status {status:?}" ))); } // rerun `vite build` whenever the UI changes. // // `node_modules` is always touched if `npm install` runs, leading to spurious // rebuilds. (This duplicate is purely organizational; it reflects that the ui // depends on node_modules.) // // See: // println!("cargo::rerun-if-changed=node_modules"); println!("cargo::rerun-if-changed=postcss.config.js"); println!("cargo::rerun-if-changed=svelte.config.js"); println!("cargo::rerun-if-changed=vite.config.js"); println!("cargo::rerun-if-changed=ui"); let status = Command::new("npx").args(["vite", "build"]).status()?; if !status.success() { return Err(io::Error::other(format!( "'npx vite build' exited with status {status:?}" ))); } Ok(()) }