Skip to content

Commit 71d0064

Browse files
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>
1 parent 416f845 commit 71d0064

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

.changes/improve-cli-init.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": patch:enhance
3+
"@tauri-apps/cli": patch:enhance
4+
---
5+
6+
Improve the `init` command behavior by detecting the project NPM package manager.

tooling/cli/src/helpers/npm.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ impl PackageManager {
3737
let mut use_npm = false;
3838
let mut use_pnpm = false;
3939
let mut use_yarn = false;
40+
let mut use_bun = false;
4041

4142
if let Ok(entries) = std::fs::read_dir(path) {
4243
for entry in entries.flatten() {
@@ -48,11 +49,13 @@ impl PackageManager {
4849
use_pnpm = true;
4950
} else if name.as_ref() == "yarn.lock" {
5051
use_yarn = true;
52+
} else if name.as_ref() == "bun.lockb" {
53+
use_bun = true;
5154
}
5255
}
5356
}
5457

55-
if !use_npm && !use_pnpm && !use_yarn {
58+
if !use_npm && !use_pnpm && !use_yarn && !use_bun {
5659
return Vec::new();
5760
}
5861

@@ -67,6 +70,9 @@ impl PackageManager {
6770
if use_yarn {
6871
found.push(PackageManager::Yarn);
6972
}
73+
if use_bun {
74+
found.push(PackageManager::Bun);
75+
}
7076

7177
found
7278
}

tooling/cli/src/init.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use crate::{
66
helpers::{
77
framework::{infer_from_package_json as infer_framework, Framework},
8+
npm::PackageManager,
89
prompts, resolve_tauri_path, template,
910
},
1011
VersionMetadata,
@@ -130,13 +131,18 @@ impl Options {
130131
)
131132
})?;
132133

134+
let detected_package_manager = match PackageManager::from_project(&self.directory).first() {
135+
Some(&package_manager) => package_manager,
136+
None => PackageManager::Npm,
137+
};
138+
133139
self.before_dev_command = self
134140
.before_dev_command
135141
.map(|s| Ok(Some(s)))
136142
.unwrap_or_else(|| {
137143
prompts::input(
138144
"What is your frontend dev command?",
139-
Some("npm run dev".to_string()),
145+
Some(default_dev_command(detected_package_manager).into()),
140146
self.ci,
141147
true,
142148
)
@@ -148,7 +154,7 @@ impl Options {
148154
.unwrap_or_else(|| {
149155
prompts::input(
150156
"What is your frontend build command?",
151-
Some("npm run build".to_string()),
157+
Some(default_build_command(detected_package_manager).into()),
152158
self.ci,
153159
true,
154160
)
@@ -158,6 +164,26 @@ impl Options {
158164
}
159165
}
160166

167+
fn default_dev_command(pm: PackageManager) -> &'static str {
168+
match pm {
169+
PackageManager::Yarn => "yarn dev",
170+
PackageManager::YarnBerry => "yarn dev",
171+
PackageManager::Npm => "npm run dev",
172+
PackageManager::Pnpm => "pnpm dev",
173+
PackageManager::Bun => "bun dev",
174+
}
175+
}
176+
177+
fn default_build_command(pm: PackageManager) -> &'static str {
178+
match pm {
179+
PackageManager::Yarn => "yarn build",
180+
PackageManager::YarnBerry => "yarn build",
181+
PackageManager::Npm => "npm run build",
182+
PackageManager::Pnpm => "pnpm build",
183+
PackageManager::Bun => "bun build",
184+
}
185+
}
186+
161187
pub fn command(mut options: Options) -> Result<()> {
162188
options = options.load()?;
163189

0 commit comments

Comments
 (0)