Added tool implementation for reading tools.
This commit is contained in:
@@ -188,18 +188,42 @@ fn build_tool(tool_dir: &Path, tool_name: &str) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 定位 tools 根目录。
|
||||
///
|
||||
/// 产物可能位于两处之一:
|
||||
/// - `tools/bin/tool_manager`(统一产物目录,registry 优先使用)
|
||||
/// - `tools/tool_manager/target/release/tool_manager`(构建产物)
|
||||
///
|
||||
/// 因此不依赖固定向上层数,而是从 exe 向上找第一个“含 bin/ 子目录且至少含一个
|
||||
/// 工具子目录”的祖先,即为 tools 根。对两种位置均正确。
|
||||
fn locate_tools_root() -> Result<PathBuf, String> {
|
||||
let exe = std::env::current_exe().map_err(|e| e.to_string())?;
|
||||
// exe = tools/tool_manager/target/release/tool_manager
|
||||
let tool_dir = exe
|
||||
.parent() // .../target/release
|
||||
.and_then(Path::parent) // .../target
|
||||
.and_then(Path::parent) // .../tool_manager
|
||||
.ok_or_else(|| "无法定位 tool_manager 目录".to_string())?;
|
||||
tool_dir
|
||||
.parent()
|
||||
.map(Path::to_path_buf)
|
||||
.ok_or_else(|| "无法定位 tools 根目录".to_string())
|
||||
let mut cur = exe.parent();
|
||||
while let Some(dir) = cur {
|
||||
if dir.join("bin").is_dir() && has_tool_subdir(dir) {
|
||||
return Ok(dir.to_path_buf());
|
||||
}
|
||||
cur = dir.parent();
|
||||
}
|
||||
Err("无法定位 tools 根目录".into())
|
||||
}
|
||||
|
||||
/// 判断目录下是否存在至少一个工具子目录(含 specs/Cargo.toml/src 之一)
|
||||
fn has_tool_subdir(dir: &Path) -> bool {
|
||||
let Ok(entries) = fs::read_dir(dir) else {
|
||||
return false;
|
||||
};
|
||||
for entry in entries.flatten() {
|
||||
let p = entry.path();
|
||||
if p.is_dir()
|
||||
&& (p.join("specs").exists()
|
||||
|| p.join("Cargo.toml").exists()
|
||||
|| p.join("src").exists())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn cargo_toml(tool_name: &str) -> String {
|
||||
|
||||
Reference in New Issue
Block a user