diff --git a/.changes/detect-package-manager-env.md b/.changes/detect-package-manager-env.md new file mode 100644 index 000000000..c46256318 --- /dev/null +++ b/.changes/detect-package-manager-env.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:enhance +"@tauri-apps/cli": patch:enhance +--- + +Detect package manager from environment variable `npm_config_user_agent` first diff --git a/crates/tauri-cli/src/helpers/npm.rs b/crates/tauri-cli/src/helpers/npm.rs index ad42d586d..1e6acdb9a 100644 --- a/crates/tauri-cli/src/helpers/npm.rs +++ b/crates/tauri-cli/src/helpers/npm.rs @@ -23,6 +23,17 @@ pub fn manager_version(package_manager: &str) -> Option { .unwrap_or_default() } +fn detect_yarn_or_berry() -> PackageManager { + if manager_version("yarn") + .map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default()) + .unwrap_or(false) + { + PackageManager::YarnBerry + } else { + PackageManager::Yarn + } +} + #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum PackageManager { Npm, @@ -59,8 +70,25 @@ impl PackageManager { .unwrap_or(Self::Npm) } + /// Detects package manager from the `npm_config_user_agent` environment variable + fn from_environment_variable() -> Option { + let npm_config_user_agent = std::env::var("npm_config_user_agent").ok()?; + match npm_config_user_agent { + user_agent if user_agent.starts_with("pnpm/") => Some(Self::Pnpm), + user_agent if user_agent.starts_with("deno/") => Some(Self::Deno), + user_agent if user_agent.starts_with("bun/") => Some(Self::Bun), + user_agent if user_agent.starts_with("yarn/") => Some(detect_yarn_or_berry()), + user_agent if user_agent.starts_with("npm/") => Some(Self::Npm), + _ => None, + } + } + /// Detects all possible package managers from the given directory. pub fn all_from_project>(path: P) -> Vec { + if let Some(from_env) = Self::from_environment_variable() { + return vec![from_env]; + } + let mut found = Vec::new(); if let Ok(entries) = std::fs::read_dir(path) { @@ -70,17 +98,7 @@ impl PackageManager { match name.as_ref() { "package-lock.json" => found.push(PackageManager::Npm), "pnpm-lock.yaml" => found.push(PackageManager::Pnpm), - "yarn.lock" => { - let yarn = if manager_version("yarn") - .map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default()) - .unwrap_or(false) - { - PackageManager::YarnBerry - } else { - PackageManager::Yarn - }; - found.push(yarn); - } + "yarn.lock" => found.push(detect_yarn_or_berry()), "bun.lock" | "bun.lockb" => found.push(PackageManager::Bun), "deno.lock" => found.push(PackageManager::Deno), _ => (), diff --git a/crates/tauri-macros/src/command/handler.rs b/crates/tauri-macros/src/command/handler.rs index c0db6a78a..add699b73 100644 --- a/crates/tauri-macros/src/command/handler.rs +++ b/crates/tauri-macros/src/command/handler.rs @@ -66,7 +66,7 @@ impl Parse for Handler { } /// Try to get the plugin name by parsing the input for a `#![plugin(...)]` attribute, -/// if it's not present, try getting it from `CARGO_PKG_NAME` enviroment variable +/// if it's not present, try getting it from `CARGO_PKG_NAME` environment variable fn try_get_plugin_name(input: &ParseBuffer<'_>) -> Result, syn::Error> { if let Ok(attrs) = input.call(Attribute::parse_inner) { for attr in attrs {