Эх сурвалжийг харах

feat(cli): detect project NPM package manager on init (#10504)

* feat(cli): improve init behavior to ask once

* chore(cli): bump version

* fix(clippy): fix clippy warning

* feat(cli): add `bun` and fix version bump msg

* refactor(cli): auto detect the package manager

* move function

* update change file

* update change file

---------

Co-authored-by: Lucas Nogueira <lucas@tauri.app>
苏向夜 11 сар өмнө
parent
commit
71d00646a9

+ 6 - 0
.changes/improve-cli-init.md

@@ -0,0 +1,6 @@
+---
+"tauri-cli": patch:enhance
+"@tauri-apps/cli": patch:enhance
+---
+
+Improve the `init` command behavior by detecting the project NPM package manager.

+ 7 - 1
tooling/cli/src/helpers/npm.rs

@@ -37,6 +37,7 @@ impl PackageManager {
     let mut use_npm = false;
     let mut use_pnpm = false;
     let mut use_yarn = false;
+    let mut use_bun = false;
 
     if let Ok(entries) = std::fs::read_dir(path) {
       for entry in entries.flatten() {
@@ -48,11 +49,13 @@ impl PackageManager {
           use_pnpm = true;
         } else if name.as_ref() == "yarn.lock" {
           use_yarn = true;
+        } else if name.as_ref() == "bun.lockb" {
+          use_bun = true;
         }
       }
     }
 
-    if !use_npm && !use_pnpm && !use_yarn {
+    if !use_npm && !use_pnpm && !use_yarn && !use_bun {
       return Vec::new();
     }
 
@@ -67,6 +70,9 @@ impl PackageManager {
     if use_yarn {
       found.push(PackageManager::Yarn);
     }
+    if use_bun {
+      found.push(PackageManager::Bun);
+    }
 
     found
   }

+ 28 - 2
tooling/cli/src/init.rs

@@ -5,6 +5,7 @@
 use crate::{
   helpers::{
     framework::{infer_from_package_json as infer_framework, Framework},
+    npm::PackageManager,
     prompts, resolve_tauri_path, template,
   },
   VersionMetadata,
@@ -130,13 +131,18 @@ impl Options {
       )
     })?;
 
+    let detected_package_manager = match PackageManager::from_project(&self.directory).first() {
+      Some(&package_manager) => package_manager,
+      None => PackageManager::Npm,
+    };
+
     self.before_dev_command = self
       .before_dev_command
       .map(|s| Ok(Some(s)))
       .unwrap_or_else(|| {
         prompts::input(
           "What is your frontend dev command?",
-          Some("npm run dev".to_string()),
+          Some(default_dev_command(detected_package_manager).into()),
           self.ci,
           true,
         )
@@ -148,7 +154,7 @@ impl Options {
       .unwrap_or_else(|| {
         prompts::input(
           "What is your frontend build command?",
-          Some("npm run build".to_string()),
+          Some(default_build_command(detected_package_manager).into()),
           self.ci,
           true,
         )
@@ -158,6 +164,26 @@ impl Options {
   }
 }
 
+fn default_dev_command(pm: PackageManager) -> &'static str {
+  match pm {
+    PackageManager::Yarn => "yarn dev",
+    PackageManager::YarnBerry => "yarn dev",
+    PackageManager::Npm => "npm run dev",
+    PackageManager::Pnpm => "pnpm dev",
+    PackageManager::Bun => "bun dev",
+  }
+}
+
+fn default_build_command(pm: PackageManager) -> &'static str {
+  match pm {
+    PackageManager::Yarn => "yarn build",
+    PackageManager::YarnBerry => "yarn build",
+    PackageManager::Npm => "npm run build",
+    PackageManager::Pnpm => "pnpm build",
+    PackageManager::Bun => "bun build",
+  }
+}
+
 pub fn command(mut options: Options) -> Result<()> {
   options = options.load()?;