use std::process::Command; fn main() { let mut args = std::env::args(); let Some(task) = args.nth(1) else { println!("Error: No task is specified"); return; }; if task == "execute" { let Some(program) = args.next() else { println!("Error: No program is specified"); return; }; if let Err(err) = Command::new(program) .args(args) .remove_envs( // When a binary crate is run with 'cargo run', cargo sets environment // variables with information about the crate, package & cargo manifest. // These environment variables are unwanted when the program run here // is cargo so they are removed. // // If cargo is the program run here and the environment variables are // kept, cargo does not overwrite them, which can cause unnecessary // rebuilds of dependencies std::env::vars() .map(|(key, _)| key) .filter(|key| key.starts_with("CARGO_") && key != "CARGO_HOME"), ) .status() { println!("Error: Failed to execute command: {err}"); } } else { println!("Error: Unknown task '{task}'"); } } trait CommandExt { fn remove_envs(&mut self, keys: impl IntoIterator) -> &mut Self; } impl CommandExt for Command { fn remove_envs(&mut self, keys: impl IntoIterator) -> &mut Self { for env_key in keys { self.env_remove(env_key); } self } }