From 798ec373c0c7cb9d77529f428183289b578e57ad Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 6 Jul 2024 14:22:19 -0500 Subject: [PATCH] Create empty environment for `uv run --isolated` (#4849) ## Summary If you pass `--isolated` but no `--with`, at present, we don't create any environment (so `--python` isn't respected and `python` will fail entirely if it wasn't already in your path). Now, we create a base environment in `--isolated` even if `with` wasn't provided. Closes https://github.com/astral-sh/uv/issues/4846. Closes https://github.com/astral-sh/uv/issues/4776. --- crates/uv/src/commands/project/run.rs | 55 ++++++++++++++++----------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/crates/uv/src/commands/project/run.rs b/crates/uv/src/commands/project/run.rs index 52abd1c7f4f0..300465b8b3a6 100644 --- a/crates/uv/src/commands/project/run.rs +++ b/crates/uv/src/commands/project/run.rs @@ -231,12 +231,14 @@ pub(crate) async fn run( ); } - // If necessary, create an environment for the ephemeral requirements. + // If necessary, create an environment for the ephemeral requirements or command. let temp_dir; - let ephemeral_env = if requirements.is_empty() { + let ephemeral_env = if requirements.is_empty() && base_interpreter.is_some() { + // If we don't have any `--with` requirements, and we already have a base environment, then + // there's no need to create an additional environment. None } else { - debug!("Syncing ephemeral environment."); + debug!("Creating ephemeral environment"); // Discover an interpreter. let interpreter = if let Some(base_interpreter) = &base_interpreter { @@ -274,29 +276,36 @@ pub(crate) async fn run( false, )?; - let client_builder = BaseClientBuilder::new() - .connectivity(connectivity) - .native_tls(native_tls); + if requirements.is_empty() { + Some(venv) + } else { + debug!("Syncing ephemeral requirements"); - let spec = - RequirementsSpecification::from_simple_sources(&requirements, &client_builder).await?; + let client_builder = BaseClientBuilder::new() + .connectivity(connectivity) + .native_tls(native_tls); - // Install the ephemeral requirements. - Some( - project::update_environment( - venv, - spec, - &settings, - &state, - preview, - connectivity, - concurrency, - native_tls, - cache, - printer, + let spec = + RequirementsSpecification::from_simple_sources(&requirements, &client_builder) + .await?; + + // Install the ephemeral requirements. + Some( + project::update_environment( + venv, + spec, + &settings, + &state, + preview, + connectivity, + concurrency, + native_tls, + cache, + printer, + ) + .await?, ) - .await?, - ) + } }; debug!("Running `{command}`");