Tauri运行二进制文件
配置流程
https://tauri.app/zh-cn/v1/guides/building/sidecar/
您可能需要嵌入依赖的二进制文件以使您的应用程序正常工作或阻止用户安装其他依赖项(例如,Node.js 或 Python)。我们将此二进制文件称为 sidecar
。
要捆绑您选择的二进制文件,您可以将该属性externalBin
添加到.tauri > bundletauri.conf.json
在此处查看有关 tauri.conf.json 配置的更多信息。
externalBin
需要一个以绝对路径或相对路径为目标的二进制文件的字符串列表。
这是一个示例来说明配置。这不是一个完整的tauri.conf.json
文件:
JSON
{
"tauri": {
"bundle": {
"externalBin": [
"/absolute/path/to/sidecar",
"relative/path/to/binary",
"binaries/my-sidecar"
]
},
"allowlist": {
"shell": {
"sidecar": true,
"scope": [
{ "name": "/absolute/path/to/sidecar", "sidecar": true },
{ "name": "relative/path/to/binary", "sidecar": true },
{ "name": "binaries/my-sidecar", "sidecar": true }
]
}
}
}
}
-$TARGET_TRIPLE`指定路径上必须存在具有相同名称和后缀的二进制文件。例如,`"externalBin": ["binaries/my-sidecar"]`需要`src-tauri/binaries/my-sidecar-x86_64-unknown-linux-gnu`Linux 上的可执行文件。您可以通过查看命令报告的属性来找到**当前**平台的目标三元组。`host:rustc -Vv
如果grep
和cut
命令可用(在大多数 Unix 系统上应该如此),您可以使用以下命令直接提取目标三元组:
Shell
$ rustc -Vv | grep host | cut -f2 -d' '
在 Windows 上,您可以改用 PowerShell:
PowerShell
$ rustc -Vv | Select-String "host:" | ForEach-Object {$_.Line.split(" ")[1]}
下面是一个 Node.js 脚本,用于将目标三元组附加到二进制文件中:
JavaScript
const execa = require('execa')
const fs = require('fs')
let extension = ''
if (process.platform === 'win32') {
extension = '.exe'
}
async function main() {
const rustInfo = (await execa('rustc', ['-vV'])).stdout
const targetTriple = /host: (\S+)/g.exec(rustInfo)[1]
if (!targetTriple) {
console.error('Failed to determine platform target triple')
}
fs.renameSync(
`src-tauri/binaries/sidecar${extension}`,
`src-tauri/binaries/sidecar-${targetTriple}${extension}`
)
}
main().catch((e) => {
throw e
})
比如我的M1:
配置node案例
- 找到node 的存放目录
- 复制到src-tauri的bin目录中
- 查看当前的系统扩展
- 重命名:根据系统扩展命名,windows以.exe结尾
- 添加shell指令
- 配置资源
- 使用指令
HTML
<script setup lang="ts">
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://vuejs.org/api/sfc-script-setup.html#script-setup
import { Command } from "@tauri-apps/api/shell";
import Greet from "./components/Greet.vue";
import { ref } from "vue";
const value = ref("")
const handleTest = async ()=>{
const cm = Command.sidecar("bin/node", '--version')
const v = await cm.execute();
// 得到输出结果
value.value = v.stdout;
console.log("---")
}
</script>
<template>
<div class="container">
<button @click="handleTest">test</button>
<button @click="handleRunTs">run .ts</button>
<div>value: {{ value }} </div>
<Greet />
</div>
</template>
<style scoped>
.logo.vite:hover {
filter: drop-shadow(0 0 2em #747bff);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #249b73);
}
</style>
在Rust文件中运行node
使用std::process::Command;
Rust
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use std::process::Command;
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
fn main() {
let output = Command::new("/node")
.arg("-v")
.output()
.expect("Failed to execute node command");
if output.status.success() {
// 获取标准输出
let stdout_str = String::from_utf8_lossy(&output.stdout);
println!("Node.js 版本: {}", stdout_str);
} else {
// 获取标准错误输出
let stderr_str = String::from_utf8_lossy(&output.stderr);
eprintln!("获取 Node.js 版本失败,错误信息: {}", stderr_str);
}
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}