From ebcd97ac1c2e4c3fe5595020ae59d37ff355f583 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 6 Apr 2025 11:06:18 +0800 Subject: [PATCH 1/2] fix(cli): try detect package manager from env --- .changes/detect-package-manager-env.md | 6 ++++ crates/tauri-cli/src/helpers/npm.rs | 40 +++++++++++++++++++------- 2 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 .changes/detect-package-manager-env.md diff --git a/.changes/detect-package-manager-env.md b/.changes/detect-package-manager-env.md new file mode 100644 index 000000000000..bbdf0549435e --- /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 enviroment 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 ad42d586d1da..e19748a446a7 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` enviroment variable + fn from_env_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_env_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), _ => (), From f50edcbed3c2a85104dfa83e06a520d1a68b500b Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 6 Apr 2025 11:11:37 +0800 Subject: [PATCH 2/2] Typo --- .changes/detect-package-manager-env.md | 2 +- crates/tauri-cli/src/helpers/npm.rs | 6 +++--- crates/tauri-macros/src/command/handler.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.changes/detect-package-manager-env.md b/.changes/detect-package-manager-env.md index bbdf0549435e..c46256318858 100644 --- a/.changes/detect-package-manager-env.md +++ b/.changes/detect-package-manager-env.md @@ -3,4 +3,4 @@ "@tauri-apps/cli": patch:enhance --- -Detect package manager from enviroment variable `npm_config_user_agent` first +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 e19748a446a7..1e6acdb9a55c 100644 --- a/crates/tauri-cli/src/helpers/npm.rs +++ b/crates/tauri-cli/src/helpers/npm.rs @@ -70,8 +70,8 @@ impl PackageManager { .unwrap_or(Self::Npm) } - /// Detects package manager from the `npm_config_user_agent` enviroment variable - fn from_env_variable() -> Option { + /// 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), @@ -85,7 +85,7 @@ impl PackageManager { /// Detects all possible package managers from the given directory. pub fn all_from_project>(path: P) -> Vec { - if let Some(from_env) = Self::from_env_variable() { + if let Some(from_env) = Self::from_environment_variable() { return vec![from_env]; } diff --git a/crates/tauri-macros/src/command/handler.rs b/crates/tauri-macros/src/command/handler.rs index c0db6a78a244..add699b73da2 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 {