con un clic
spawn-process
// Guide for writing subprocess execution code using the vite_command crate
// Guide for writing subprocess execution code using the vite_command crate
Bump vite-task git dependency to the latest main commit. Use when you need to update the vite-task crates (fspy, vite_glob, vite_path, vite_str, vite_task, vite_workspace) in vite-plus.
Add a new ecosystem-ci test case for testing real-world projects against vite-plus
Compare tsdown CLI options with vp pack and sync any new or removed options. Use when tsdown is upgraded or when you need to check for CLI option drift between tsdown and vp pack.
| name | spawn-process |
| description | Guide for writing subprocess execution code using the vite_command crate |
| allowed-tools | Read, Grep, Glob, Edit, Write, Bash |
When writing Rust code that needs to spawn subprocesses (resolve binaries, build commands, execute programs), always use the vite_command crate. Never use which, tokio::process::Command::new, or std::process::Command::new directly.
vite_command::resolve_bin(name, path_env, cwd) — Resolve a binary name to an absolute pathHandles PATHEXT (.cmd/.bat) on Windows. Pass None for path_env to search the current process PATH.
// Resolve using current PATH
let bin = vite_command::resolve_bin("node", None, &cwd)?;
// Resolve using a custom PATH
let custom_path = std::ffi::OsString::from(&path_env_str);
let bin = vite_command::resolve_bin("eslint", Some(&custom_path), &cwd)?;
vite_command::build_command(bin_path, cwd) — Build a command for a pre-resolved binaryReturns tokio::process::Command with cwd, inherited stdio, and fix_stdio_streams on Unix already configured. Add args, envs, or override stdio as needed.
let bin = vite_command::resolve_bin("eslint", None, &cwd)?;
let mut cmd = vite_command::build_command(&bin, &cwd);
cmd.args(&[".", "--fix"]);
cmd.env("NODE_ENV", "production");
let mut child = cmd.spawn()?;
let status = child.wait().await?;
vite_command::build_shell_command(shell_cmd, cwd) — Build a shell commandUses /bin/sh -c on Unix, cmd.exe /C on Windows. Same stdio and fix_stdio_streams setup as build_command.
let mut cmd = vite_command::build_shell_command("echo hello && ls", &cwd);
let mut child = cmd.spawn()?;
let status = child.wait().await?;
vite_command::run_command(bin_name, args, envs, cwd) — Resolve + build + run in one callCombines resolve_bin, build_command, and status().await. The envs HashMap must include "PATH" if you want custom PATH resolution.
let envs = HashMap::from([("PATH".to_string(), path_value)]);
let status = vite_command::run_command("node", &["--version"], &envs, &cwd).await?;
Add vite_command to the crate's Cargo.toml:
[dependencies]
vite_command = { workspace = true }
Do NOT add which as a direct dependency — binary resolution goes through vite_command::resolve_bin.
crates/vite_global_cli/src/shim/exec.rs uses synchronous std::process::Command with Unix exec() for process replacement. This is the only place that bypasses vite_command.