Skip to content

Commit 100a445

Browse files
authored
fix(cli): fix yarn berry detection (#11529)
closes #11495
1 parent 4191a7a commit 100a445

File tree

8 files changed

+49
-46
lines changed

8 files changed

+49
-46
lines changed

.changes/cli-yarn-berry.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": "patch:bug"
3+
"@tauri-apps/cli": "patch:bug"
4+
---
5+
6+
Fix detecting yarn berry (v2 and higher) in various tauri cli commands.

crates/tauri-cli/src/add.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,7 @@ pub fn run(options: Options) -> Result<()> {
8181
})?;
8282

8383
if !metadata.rust_only {
84-
if let Some(manager) = frontend_dir
85-
.map(PackageManager::from_project)
86-
.and_then(|managers| managers.into_iter().next())
87-
{
84+
if let Some(manager) = frontend_dir.map(PackageManager::from_project) {
8885
let npm_version_req = version
8986
.map(ToString::to_string)
9087
.or(metadata.version_req.as_ref().map(|v| match manager {

crates/tauri-cli/src/helpers/npm.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ use anyhow::Context;
77
use crate::helpers::cross_command;
88
use std::{fmt::Display, path::Path, process::Command};
99

10+
pub fn manager_version(package_manager: &str) -> Option<String> {
11+
cross_command(package_manager)
12+
.arg("-v")
13+
.output()
14+
.map(|o| {
15+
if o.status.success() {
16+
let v = String::from_utf8_lossy(o.stdout.as_slice()).to_string();
17+
Some(v.split('\n').next().unwrap().to_string())
18+
} else {
19+
None
20+
}
21+
})
22+
.ok()
23+
.unwrap_or_default()
24+
}
25+
1026
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
1127
pub enum PackageManager {
1228
Npm,
@@ -35,7 +51,16 @@ impl Display for PackageManager {
3551
}
3652

3753
impl PackageManager {
38-
pub fn from_project<P: AsRef<Path>>(path: P) -> Vec<Self> {
54+
/// Detects package manager from the given directory, falls back to [`PackageManager::Npm`].
55+
pub fn from_project<P: AsRef<Path>>(path: P) -> Self {
56+
Self::all_from_project(path)
57+
.first()
58+
.copied()
59+
.unwrap_or(Self::Npm)
60+
}
61+
62+
/// Detects all possible package managers from the given directory.
63+
pub fn all_from_project<P: AsRef<Path>>(path: P) -> Vec<Self> {
3964
let mut found = Vec::new();
4065

4166
if let Ok(entries) = std::fs::read_dir(path) {
@@ -47,7 +72,15 @@ impl PackageManager {
4772
} else if name.as_ref() == "pnpm-lock.yaml" {
4873
found.push(PackageManager::Pnpm);
4974
} else if name.as_ref() == "yarn.lock" {
50-
found.push(PackageManager::Yarn);
75+
let yarn = if manager_version("yarn")
76+
.map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default())
77+
.unwrap_or(false)
78+
{
79+
PackageManager::YarnBerry
80+
} else {
81+
PackageManager::Yarn
82+
};
83+
found.push(yarn);
5184
} else if name.as_ref() == "bun.lockb" {
5285
found.push(PackageManager::Bun);
5386
} else if name.as_ref() == "deno.lock" {

crates/tauri-cli/src/info/env_nodejs.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,7 @@
55
use super::{ActionResult, SectionItem, VersionMetadata};
66
use colored::Colorize;
77

8-
use crate::helpers::cross_command;
9-
10-
pub fn manager_version(package_manager: &str) -> Option<String> {
11-
cross_command(package_manager)
12-
.arg("-v")
13-
.output()
14-
.map(|o| {
15-
if o.status.success() {
16-
let v = String::from_utf8_lossy(o.stdout.as_slice()).to_string();
17-
Some(v.split('\n').next().unwrap().to_string())
18-
} else {
19-
None
20-
}
21-
})
22-
.ok()
23-
.unwrap_or_default()
24-
}
8+
use crate::helpers::{cross_command, npm::manager_version};
259

2610
pub fn items(metadata: &VersionMetadata) -> Vec<SectionItem> {
2711
let node_target_ver = metadata.js_cli.node.replace(">= ", "");

crates/tauri-cli/src/info/packages_nodejs.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// SPDX-License-Identifier: MIT
44

55
use super::SectionItem;
6-
use super::{env_nodejs::manager_version, VersionMetadata};
6+
use super::VersionMetadata;
77
use colored::Colorize;
88
use serde::Deserialize;
99
use std::path::PathBuf;
@@ -77,7 +77,7 @@ pub fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Opti
7777
}
7878

7979
pub fn package_manager(frontend_dir: &PathBuf) -> PackageManager {
80-
let found = PackageManager::from_project(frontend_dir);
80+
let found = PackageManager::all_from_project(frontend_dir);
8181

8282
if found.is_empty() {
8383
println!(
@@ -98,15 +98,7 @@ pub fn package_manager(frontend_dir: &PathBuf) -> PackageManager {
9898
);
9999
}
100100

101-
if pkg_manager == PackageManager::Yarn
102-
&& manager_version("yarn")
103-
.map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default())
104-
.unwrap_or(false)
105-
{
106-
PackageManager::YarnBerry
107-
} else {
108-
pkg_manager
109-
}
101+
pkg_manager
110102
}
111103

112104
pub fn items(

crates/tauri-cli/src/init.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,7 @@ impl Options {
131131
)
132132
})?;
133133

134-
let detected_package_manager = match PackageManager::from_project(&self.directory).first() {
135-
Some(&package_manager) => package_manager,
136-
None => PackageManager::Npm,
137-
};
134+
let detected_package_manager = PackageManager::from_project(&self.directory);
138135

139136
self.before_dev_command = self
140137
.before_dev_command

crates/tauri-cli/src/migrate/migrations/v1/frontend.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,7 @@ pub fn migrate(frontend_dir: &Path) -> Result<Vec<String>> {
8484
)
8585
};
8686

87-
let pm = PackageManager::from_project(frontend_dir)
88-
.into_iter()
89-
.next()
90-
.unwrap_or(PackageManager::Npm);
87+
let pm = PackageManager::from_project(frontend_dir);
9188

9289
for pkg in ["@tauri-apps/cli", "@tauri-apps/api"] {
9390
let version = pm

crates/tauri-cli/src/migrate/migrations/v2_rc.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ pub fn run() -> Result<()> {
3535
}
3636

3737
fn migrate_npm_dependencies(frontend_dir: &Path) -> Result<()> {
38-
let pm = PackageManager::from_project(frontend_dir)
39-
.into_iter()
40-
.next()
41-
.unwrap_or(PackageManager::Npm);
38+
let pm = PackageManager::from_project(frontend_dir);
4239

4340
let mut install_deps = Vec::new();
4441
for pkg in [

0 commit comments

Comments
 (0)