fix(task): regression where npx <command> sometimes couldn't find command (#23730)

Closes https://github.com/denoland/deno/issues/23724
This commit is contained in:
David Sherret 2024-05-08 23:16:44 -04:00 committed by GitHub
parent 47f7bed677
commit 263b6b971d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 59 additions and 9 deletions

4
Cargo.lock generated
View file

@ -1876,9 +1876,9 @@ dependencies = [
[[package]]
name = "deno_task_shell"
version = "0.16.0"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b44af10161906e1bccc1fc966f074bec0148997bb7e2221ecd29416dcad90b3"
checksum = "97e5ff66a1e89edb7ca0c36b73a8fcdc008ba426c4ad7a36e1dfb3f4a166179e"
dependencies = [
"anyhow",
"futures",

View file

@ -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

View file

@ -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<String, String>, value: String) {
fn collect_env_vars() -> HashMap<String, String> {
// get the starting env vars (the PWD env var will be set by deno_task_shell)
let mut env_vars = std::env::vars().collect::<HashMap<String, String>>();
let mut env_vars = std::env::vars()
.map(|(k, v)| {
if cfg!(windows) {
(k.to_uppercase(), v)
} else {
(k, v)
}
})
.collect::<HashMap<String, String>>();
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");

View file

@ -0,0 +1,11 @@
{
"tempDir": true,
"steps": [{
"commandName": "npm",
"args": "install",
"output": "[WILDCARD]"
}, {
"args": "task say",
"output": "main.out"
}]
}

View file

@ -0,0 +1,7 @@
{
// not byonm
"nodeModulesDir": true,
"tasks": {
"say": "npx cowsay moo"
}
}

View file

@ -0,0 +1,9 @@
Task say npx cowsay moo
_____
< moo >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

View file

@ -0,0 +1,5 @@
{
"dependencies": {
"cowsay": "*"
}
}

View file

@ -1,2 +1,4 @@
Task non-existent npx this-command-should-not-exist-for-you
npx: could not resolve command 'this-command-should-not-exist-for-you'
npm ERR! code E404
npm ERR! 404 Not Found - GET http://localhost:4260/this-command-should-not-exist-for-you
[WILDCARD]