Tauri 打包程序运行时会带一个终端,该怎么处理?

再使用Tauri Rust时, 使用了 Command::new("adb"),这样我再打包后,运行打包后的应用程序会自带一个终端
我尝试过在main.rs中添加代码

#![cfg_attr(
    all(not(debug_assertions), target_os = "windows"),
    windows_subsystem = "windows"
)]

但是这样打包后的程序不会自带终端,但是我调用 Command::new("adb") 的时候会弹出一个终端并且执行完成后就会消失
我该怎么处理呢



根据AI的反馈,我是独立封装的一个adb方法 ,代码如下

#[tauri::command]
pub fn exec(mut command: String) -> Result<String, String> {
    command = command.replace("\r\n", "");
    let mut child = Command::new("adb")
        .arg("shell")
        .arg(&command)
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .map_err(|e| format!("Failed to execute command: {}", e))?;

    let stdout = child.stdout.take().unwrap();
    let stderr = child.stderr.take().unwrap();
    let mut stdout_reader = io::BufReader::new(stdout);
    let mut stderr_reader = io::BufReader::new(stderr);

    let mut stdout_output = String::new();
    stdout_reader
        .read_to_string(&mut stdout_output)
        .expect("error");

    let mut stderr_output = String::new();
    stderr_reader
        .read_to_string(&mut stderr_output)
        .expect("error");

    let status = child.wait();
    let result_str = stdout_output.clone();
    println!("result_str:{}", result_str);
    println!("stdout_output:{}", stdout_output);
    println!("stderr_output:{}", stderr_output);
    println!("{:?}", status);
    if stderr_output.is_empty() {
        Ok(stdout_output)
    } else {
        Err(stderr_output)
    }
}

在其他地方我是直接调用的该方法

阅读 1.6k
avatarAI BotBETA

这个问题似乎是在使用Tauri Rust打包程序时遇到了问题。你提到,你的程序在打包后运行时会带一个终端,你希望解决这个问题。

首先,我要指出的是,Tauri是一个轻量级的Rust WebAssembly打包器,它允许你使用Rust编写Web应用程序,并且可以将其编译为Wasm格式,以便在Web上运行。Tauri并不直接支持创建或操控终端。

然而,你的问题可能是由于在程序中使用了 Command::new("adb")Command::newstd::process::Command 的构造函数,它创建一个新的进程并运行给定的命令。在你的情况下,这个命令看起来是 "adb"。

"adb" 是 Android Debug Bridge 的缩写,它是一个命令行工具,允许你在计算机上与 Android 设备进行通信。这个工具通常不会在Tauri打包的Web应用程序中运行,除非你的应用程序明确要求这样做。

如果你希望在Tauri打包的程序中运行adb命令,你可能需要使用一个不同的方法。你可能需要将adb命令的执行封装在一个独立的rust函数中,并在需要的时候调用这个函数。这样,你可以更好地控制adb命令的执行,并且不会在程序运行时自动打开一个终端。

另外,我注意到你尝试使用 #![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] 这段代码来改变windows子系统,但这并不能解决你的问题。这段代码的作用是在非debug构建和在Windows操作系统上运行时,将windows子系统设置为windows。然而,这并不会影响adb命令的执行,也不会阻止程序运行时自动打开一个终端。

总的来说,我建议你重新审视你的代码,看看是否有可能将adb命令的执行封装在一个单独的函数中,并在需要的时候调用这个函数,而不是直接在main函数中使用 Command::new。这样做将使你更好地控制adb命令的执行,并且可能解决你的问题。

1 个回答

调用cmd时传入一个flag:

#[cfg(target_os = "windows")]
use winapi::um::winbase::CREATE_NO_WINDOW;

fn foo() {
    let mut cmd = Command::new(cmd);

    // ...
    cmd.args(args);

    #[cfg(target_os = "windows")]
    cmd.creation_flags(CREATE_NO_WINDOW);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题