Skip to content

Commit 51d8767

Browse files
committed
chore: 添加 snm_downloader 依赖并重构 PackageManagerSetup
- 在 `Cargo.toml` 中添加 `snm_downloader` 依赖项以支持资源下载功能。 - 重构 `PackageManagerSetup` 结构体中的 `find_up_package_manager` 和 `ensure_package_manager` 方法,增强包管理器的查找和下载逻辑。 - 确保代码整洁性和可读性,保持功能一致性。
1 parent d6f86e0 commit 51d8767

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

crates/package_manager/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ anyhow = { workspace = true }
88
lazy-regex = { workspace = true }
99
package_json_parser = { workspace = true }
1010
snm_config = { workspace = true }
11+
snm_downloader = { workspace = true }
1112
strum = { workspace = true }
1213
up_finder = { workspace = true }
Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,64 @@
1-
// use std::str::FromStr;
1+
use std::{path::PathBuf, str::FromStr};
22

3-
// use package_json_parser::PackageJsonParser;
3+
use package_json_parser::PackageJsonParser;
44
use snm_config::snm_config::SnmConfig;
5-
// use up_finder::UpFinder;
5+
use snm_downloader::{DownloadPackageManagerResource, download_resource};
6+
use up_finder::UpFinder;
67

7-
// use crate::PackageManager;
8+
use crate::PackageManager;
89

910
pub struct PackageManagerSetup {
1011
pub config: SnmConfig,
1112
}
1213

1314
impl PackageManagerSetup {
14-
// fn find_up_package_manager(&self) -> anyhow::Result<Option<PackageManager>> {
15+
pub fn find_up_package_manager(&self) -> anyhow::Result<Option<PackageManager>> {
16+
let find_up = UpFinder::builder().cwd(&self.config.workspace).build();
1517

16-
// let find_up = UpFinder::builder()
17-
// .cwd(&self.config.workspace) // 从当前目录开始
18-
// .build();
18+
let files = find_up.find_up("package.json");
1919

20-
// let files = find_up.find_up("package.json");
20+
if files.is_empty() {
21+
return Ok(None);
22+
}
2123

22-
// if files.is_empty() {
23-
// return Ok(None);
24-
// }
24+
let Some(package_manager_raw) = files.iter().find_map(|item| {
25+
let Ok(package_json) = PackageJsonParser::parse(item) else {
26+
return None;
27+
};
2528

26-
// let Some(package_manager) = files.iter().find_map(|item| {
27-
// let Ok(package_json) = PackageJsonParser::parse(item) else {
28-
// return None;
29-
// };
29+
let Some(raw) = package_json.package_manager else {
30+
return None;
31+
};
3032

31-
// let Some(raw) = package_json.package_manager else {
32-
// return None;
33-
// };
33+
Some(raw)
34+
}) else {
35+
return Ok(None);
36+
};
3437

35-
// let Some(package_manager) = PackageManager::from_str(&raw.0).ok() else {
36-
// return None;
37-
// };
38+
let package_manager = PackageManager::from_str(&package_manager_raw.0)?;
3839

39-
// Some(package_manager)
40-
// }) else {
41-
// Ok(None)
42-
// }
40+
Ok(Some(package_manager))
41+
}
4342

44-
// Ok(None)
43+
pub async fn ensure_package_manager(
44+
&self,
45+
package_manager: &PackageManager,
46+
) -> anyhow::Result<PathBuf> {
47+
let mut dir = self
48+
.config
49+
.node_modules_dir
50+
.join(package_manager.name())
51+
.join(package_manager.version());
52+
let file = dir.join("package.json");
53+
if !file.try_exists()? {
54+
let resource = DownloadPackageManagerResource::builder()
55+
.config(&self.config)
56+
.bin_name(package_manager.name().to_string())
57+
.version(package_manager.version().to_string())
58+
.build();
4559

46-
// }
60+
dir = download_resource(resource).await?;
61+
}
62+
Ok(dir)
63+
}
4764
}

0 commit comments

Comments
 (0)