windows: Fix extensions couldn't start if the path contained spaces (#15489)

Closes #15441 .

Fixed the issue where extensions couldn't start if the path contained
spaces. Additionally, this PR introduces the `node_environment_path`
function to obtain the PATH environment variable which includes the node
path.

Release Notes:

- N/A
This commit is contained in:
张小白 2024-08-29 10:32:15 +08:00 committed by GitHub
parent e8dfc30314
commit 462808e5b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 27 deletions

View file

@ -10,6 +10,7 @@ use semver::Version;
use serde::Deserialize;
use smol::io::BufReader;
use smol::{fs, lock::Mutex, process::Command};
use std::ffi::OsString;
use std::io;
use std::process::{Output, Stdio};
use std::{
@ -55,6 +56,7 @@ pub struct NpmInfoDistTags {
#[async_trait::async_trait]
pub trait NodeRuntime: Send + Sync {
async fn binary_path(&self) -> Result<PathBuf>;
async fn node_environment_path(&self) -> Result<OsString>;
async fn run_npm_subcommand(
&self,
@ -216,6 +218,22 @@ impl NodeRuntime for RealNodeRuntime {
Ok(installation_path.join(NODE_PATH))
}
async fn node_environment_path(&self) -> Result<OsString> {
let installation_path = self.install_if_needed().await?;
let node_binary = installation_path.join(NODE_PATH);
let mut env_path = vec![node_binary
.parent()
.expect("invalid node binary path")
.to_path_buf()];
if let Some(existing_path) = std::env::var_os("PATH") {
let mut paths = std::env::split_paths(&existing_path).collect::<Vec<_>>();
env_path.append(&mut paths);
}
Ok(std::env::join_paths(env_path).context("failed to create PATH env variable")?)
}
async fn run_npm_subcommand(
&self,
directory: Option<&Path>,
@ -224,21 +242,9 @@ impl NodeRuntime for RealNodeRuntime {
) -> Result<Output> {
let attempt = || async move {
let installation_path = self.install_if_needed().await?;
let node_binary = installation_path.join(NODE_PATH);
let npm_file = installation_path.join(NPM_PATH);
let mut env_path = vec![node_binary
.parent()
.expect("invalid node binary path")
.to_path_buf()];
if let Some(existing_path) = std::env::var_os("PATH") {
let mut paths = std::env::split_paths(&existing_path).collect::<Vec<_>>();
env_path.append(&mut paths);
}
let env_path =
std::env::join_paths(env_path).context("failed to create PATH env variable")?;
let env_path = self.node_environment_path().await?;
if smol::fs::metadata(&node_binary).await.is_err() {
return Err(anyhow!("missing node binary file"));
@ -423,6 +429,10 @@ impl NodeRuntime for FakeNodeRuntime {
unreachable!()
}
async fn node_environment_path(&self) -> anyhow::Result<OsString> {
unreachable!()
}
async fn run_npm_subcommand(
&self,
_: Option<&Path>,