Skip to content

介绍

近期在开发rust + vite(tauri)项目的时候,发现了一个问题;就是沙箱隔离模式的环境变量继承问题;

rust本地开发中,可以通过std::env::var("PATH")或者全局变量$PATH获取环境变量的值,当然您也可以通过std::env::vars()获取所有的全局变量;

当然在开发环境中是可以获取到的,但是在build之后,rust编译器会自动将PATH环境变量设置为/usr/bin,所以无法获取到全局变量;

所以当您运行环境变量的某个命令时,是不会执行的;

因为在您的应用程序中%PATH中根本获取不到对应的变量;

案例

我在本地电脑安装了fnm,在dev之后是可以获取到where fnm命令的,如下代码:

rust
fn is_installed(program: &str) -> bool {
  let mut cmd = Command::new(if cfg!(target_os = "windows") {
      "cmd"
  } else {
      "bash"
  });
  let arg = if cfg!(target_os = "windows") {
      format!("where {}", program)
  } else {
      format!("which {}", program)
  };
  cmd.arg("-c").arg(arg);

  #[cfg(target_os = "windows")]
  {
      cmd.creation_flags(0x08000000);
  }
  let output = cmd.output().expect("Failed to execute command");
  let stdout = GBK.decode(&output.stdout);

  let result: bool = output.status.success() && !output.stdout.is_empty();

  info!(
      "{} 是否已经安装 {}, 安装结果为: {}",
      program, result, stdout.0
  );
  result
}
// result 的结果就是你电脑安装的 路径, 当然如果有路径 那返回布尔值

当您执行之后,那么您就能获取到对应的值,当然您同时也可以在终端中执行which fnm命令来获取到对应的路径。

只要您打包之后,就会返回空;那么它永远获取不到您电脑安装过的环境;

我试了好几种方案都是不行的,

  1. 通过which命令获取到对应的路径;
  2. 通过fnm命令获取版本号;
  3. 通过获取环境变量;
  4. 安装shell插件,再去获取;

解决方案

google上搜了好多资料,方案都是不可行的;于是我尝试着去github上找一找;

结果运气不错,还真的找到了一个解决方案;“构建后,shell 命令失败”

里面有句话大概解释为什么在build之后获取不到环境变量了:

“I think that's because on macOS/Linux the PATH environment variable is not inherited by default from your .bashrc and similar shell files,can you try using this crate https://github.com/tauri-apps/fix-path-env-rs and see if it fixes the issue?”

大概意思就是:我认为这是因为在 macOS/Linux 上,PATH 环境变量默认不会从您的.bashrc 和类似的 shell 文件中继承

当然人家已经整理出了解决方案;

按照对应的步骤进行操作,那么build之后就可以获取到对应的环境变量了;

wangxiaoze | MIT License.