From 263b6b971db60135e655914e7e33b8c26290a421 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 8 May 2024 23:16:44 -0400 Subject: fix(task): regression where `npx ` sometimes couldn't find command (#23730) Closes https://github.com/denoland/deno/issues/23724 --- cli/Cargo.toml | 2 +- cli/tools/task.rs | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) (limited to 'cli') diff --git a/cli/Cargo.toml b/cli/Cargo.toml index c33a1599b..6d88c5614 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -75,7 +75,7 @@ deno_lockfile.workspace = true deno_npm = "=0.18.0" deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_semver = "=0.5.4" -deno_task_shell = "=0.16.0" +deno_task_shell = "=0.16.1" deno_terminal.workspace = true eszip = "=0.68.2" napi_sym.workspace = true diff --git a/cli/tools/task.rs b/cli/tools/task.rs index 63c7f9a94..a1ee40973 100644 --- a/cli/tools/task.rs +++ b/cli/tools/task.rs @@ -16,6 +16,7 @@ use deno_core::futures; use deno_core::futures::future::LocalBoxFuture; use deno_runtime::deno_node::NodeResolver; use deno_semver::package::PackageNv; +use deno_task_shell::ExecutableCommand; use deno_task_shell::ExecuteResult; use deno_task_shell::ShellCommand; use deno_task_shell::ShellCommandContext; @@ -236,7 +237,15 @@ fn prepend_to_path(env_vars: &mut HashMap, value: String) { fn collect_env_vars() -> HashMap { // get the starting env vars (the PWD env var will be set by deno_task_shell) - let mut env_vars = std::env::vars().collect::>(); + let mut env_vars = std::env::vars() + .map(|(k, v)| { + if cfg!(windows) { + (k.to_uppercase(), v) + } else { + (k, v) + } + }) + .collect::>(); const INIT_CWD_NAME: &str = "INIT_CWD"; if !env_vars.contains_key(INIT_CWD_NAME) { if let Ok(cwd) = std::env::current_dir() { @@ -318,10 +327,17 @@ impl ShellCommand for NpxCommand { }; command.execute(context) } else { - let _ = context - .stderr - .write_line(&format!("npx: could not resolve command '{first_arg}'")); - Box::pin(futures::future::ready(ExecuteResult::from_exit_code(1))) + // can't find the command, so fallback to running the real npx command + let npx_path = match context.resolve_command_path("npx") { + Ok(npx) => npx, + Err(err) => { + let _ = context.stderr.write_line(&format!("{}", err)); + return Box::pin(futures::future::ready( + ExecuteResult::from_exit_code(err.exit_code()), + )); + } + }; + ExecutableCommand::new("npx".to_string(), npx_path).execute(context) } } else { let _ = context.stderr.write_line("npx: missing command"); -- cgit v1.2.3