diff options
Diffstat (limited to 'xtask')
| -rw-r--r-- | xtask/src/main.rs | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs index e955925..8bf25ae 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -15,10 +15,43 @@ fn main() return; }; - if let Err(err) = Command::new(program).args(args).status() { + 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<Item = String>) -> &mut Self; +} + +impl CommandExt for Command +{ + fn remove_envs(&mut self, keys: impl IntoIterator<Item = String>) -> &mut Self + { + for env_key in keys { + self.env_remove(env_key); + } + + self + } +} |
