tauri嵌入外部二进制文件,以及sidecar是什么意思?

sidecar是什么意思

有时,为了使应用程序正常运行或防止用户安装额外的依赖项(例如Node.js或Python或者ffmpeg等),你可能需要嵌入依赖的二进制文件,我们将这种二进制文件称为"sidecar",中文意思就是侧边车,我们的主程序就像主驾驶的车,依赖的二进制文件就像侧边挂载的小车一样。

要捆绑你选择的二进制文件,你可以在tauri.conf.json文件中的tauri > bundle对象下添加externalBin属性。externalBin属性需要一个字符串列表,其中包含目标二进制文件的路径,可以是绝对路径或相对路径。以下是一个示例配置,用于说明配置的结构。这不是完整的tauri.conf.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 }
        ]
      }
    }
  }
}

在这个示例中,externalBin属性包含了三个不同的二进制文件的路径,一个使用绝对路径,一个使用相对路径,还有一个使用相对路径的子目录。

对于externalBin中的每个条目,需要在指定的路径上存在一个带有-$TARGET_TRIPLE后缀的同名二进制文件。例如,"externalBin": ["binaries/my-sidecar"] 需要在Linux上存在一个src-tauri/binaries/my-sidecar-x86_64-unknown-linux-gnu可执行文件。你可以通过查看rustc -Vv命令报告的host:属性来找到当前平台的目标三重属性。

如果grep和cut命令可用,你可以直接使用以下命令从中提取目标三重属性,这些命令应该在大多数Unix系统上都可以使用:

rustc -Vv | grep host | cut -f2 -d' '

在Windows上,你可以使用PowerShell来执行相同的操作:

rustc -Vv | Select-String "host:" | ForEach-Object {$_.Line.split(" ")[1]}

以下是一个Node.js脚本,用于将目标三重属性附加到二进制文件的名称:

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
})

这个脚本会根据你的操作系统,在二进制文件的名称中附加目标三重属性。

Tauri 从 JavaScript 运行它

在 JavaScript 代码中,导入 shell 模块的 Command 类,并使用 sidecar 静态方法。

请注意,您必须配置允许列表以启用 shell > sidecar,并在 shell > scope 中配置所有二进制文件。

import { Command } from '@tauri-apps/api/shell'
// alternatively, use `window.__TAURI__.shell.Command`
// `binaries/my-sidecar` is the EXACT value specified on `tauri.conf.json > tauri > bundle > externalBin`
const command = Command.sidecar('binaries/my-sidecar')
const output = await command.execute()

Tauri 从 Rust 运行它

在 Rust 代码中,从 tauri::api::process 模块导入 Command 结构体:

// `new_sidecar()` expects just the filename, NOT the whole path like in JavaScript
let (mut rx, mut child) = Command::new_sidecar("my-sidecar")
  .expect("failed to create `my-sidecar` binary command")
  .spawn()
  .expect("Failed to spawn sidecar");

tauri::async_runtime::spawn(async move {
  // read events such as stdout
  while let Some(event) = rx.recv().await {
    if let CommandEvent::Stdout(line) = event {
      window
        .emit("message", Some(format!("'{}'", line)))
        .expect("failed to emit event");
      // write to stdin
      child.write("message from Rust\n".as_bytes()).unwrap();
    }
  }
});

请注意,您必须启用 process-command-api Cargo 特性(Tauri的CLI会在您更改配置后为您执行此操作):

# Cargo.toml
[dependencies]
tauri = { version = "1", features = ["process-command-api", ...] }

Tauri 传递参数

你可以像运行普通命令一样向Sidecar命令传递参数,如同运行普通命令一样。首先,在 tauri.conf.json 中定义需要传递给Sidecar命令的参数:

{
  "tauri": {
    "bundle": {
      "externalBin": [
        "/absolute/path/to/sidecar",
        "relative/path/to/binary",
        "binaries/my-sidecar"
      ]
    },
    "allowlist": {
      "shell": {
        "sidecar": true,
        "scope": [
          {
            "name": "binaries/my-sidecar",
            "sidecar": true,
            "args": [
              "arg1",
              "-a",
              "--arg2",
              {
                "validator": "\\S+"
              }
            ]
          }
        ]
      }
    }
  }
}

然后,要调用sidecar命令,只需将所有参数作为数组传递:

import { Command } from '@tauri-apps/api/shell'

// 或者使用 `window.__TAURI__.shell.Command`
// `binaries/my-sidecar` 是在 `tauri.conf.json > tauri > bundle > externalBin` 中指定的确切值
// 请注意,参数数组必须与 `tauri.conf.json` 中指定的完全匹配。
const command = Command.sidecar('binaries/my-sidecar', [
  'arg1',
  '-a',
  '--arg2',
  '与验证器匹配的任意字符串',
])

const output = await command.execute()

这将传递参数给Sidecar命令,并执行它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/724999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Navicat 重装 查找 保存的查询sql文件

背景:Navicat 一个收费的软件,存在的最大缺点就是收费,所以我们为了优化它会遇到卸载重装这些复杂的过程,但是我们保存的查询sql会跟随卸载Navicat而删除,为了节省时间省去不必要的麻烦,我们可以查到我们保…

基于STM32和人工智能的智能楼宇安防系统

目录 引言环境准备智能楼宇安防系统基础代码实现:实现智能楼宇安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能楼宇安防管理与优化问题解决方案与优化收尾与总结 1. 引言 随着物联网和人工智能技术的…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…

开源的语音合成项目-EdgeTTS,无需部署无需Key

前几天和大家分享了:全网爆火的AI语音合成工具-ChatTTS。 有很多小伙伴反应模型下载还有点麻烦~ 今天再给大家带来一款开源的语音合成 TTS 项目-EdgeTTS,相比ChatTTS,操作起来对小白更友好。 因为其底层是使用微软 Edge 的在线语音合成服务…

Java数据结构与算法——稀疏数组和队列

一、稀疏数组sparsearray数组 该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,可以采用稀疏数组进行压缩 1.基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法…

c++文件io,字符串io简单介绍

目录 c文件io 介绍 采用文件流对象操作文件的一般步骤 示例 注意点 利用字节流特性 字符串io 介绍 istringstream ostringstream 示例 c文件io 介绍 c根据文件内容的数据格式分为二进制文件和文本文件 基本上和c一样 c 标准库中有许多不同的标志 用于指定流对象的…

Ollama(docker)+ Open Webui(docker)+Comfyui

Windows 系统可以安装docker desktop 相对比较好用一点,其他的应该也可以 比如rancher desktop podman desktop 安装需要windows WSL 安装ollama docker docker run -d --gpusall -v D:\ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 这里…

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…

Paper Reading: PAMS:通过参数化最大尺度量化超分辨率

PAMS: Quantized Super-Resolution via Parameterized Max Scale PAMS:通过参数化最大尺度量化超分辨率, ECCV 2020 paper: https://arxiv.org/pdf/2011.04212.pdf GitHub: https://github.com/colorjam/PAMS 摘要 深度卷积神经网络(DCNNs)…

HumanPlus——斯坦福ALOHA团队开源的人形机器人:融合影子学习技术、RL、模仿学习

前言 今天只是一个平常的日子,不过看到了两篇文章 一篇是《半年冒出近百家新公司,「具身智能」也有春天》 我看完之后转发到朋友圈,并评论道:让机器人翻一万个后空翻,不如让机器人打好一个螺钉,毕竟在目前…

Flutter第十三弹 路由和导航

目标: 1.Flutter怎么创建路由? 2.怎么实现路由跳转?页面返回? 一、路由 1.1 什么是路由? 路由(Route)在移动开发中通常指页面(Page),在Android中通常指一个Activity。所谓路由管…

什么是Linux挂载

首先先说一下在Linux中一切皆文件(硬件设备也是文件),所有文件都是存放在以根目录为树形目录结构中;下面来说说一下什么是挂载 挂载:指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是…

5.音视频基础 FLV

目录 简说FLV FLV Header FLV Body Tag Header ​编辑Tag Data Audio Data Video Data Script Data 简说FLV FLV格式可以包含音频、视频和文本数据,并且可以在网络上进行流媒体传输。优点是文件大小较小,压缩效率高,并且可以在较低…

深度解析ISO9001质量管理体系认证的核心优势

ISO9001质量管理体系认证是一项全球通用的标准,旨在帮助企业优化质量管理,提升市场竞争力。本文将详细解析ISO9001认证为企业带来的多重核心优势。 首先,ISO9001认证显著提升了企业的产品和服务质量。通过建立和实施系统化的质量管理流程&…

为数据安全护航,袋鼠云在数据分类分级上的探索实践

在大数据时代,数据具有多源异构的特性,且价值各异,企业需依据数据的重要性、价值指数等予以区分,以利采取不同的数据保护举措,避免数据泄露。故而,数据分类分级管理属于数据安全保护中极为重要的环节之一。…

小白速成AI大模型就看这份资源包

前言 在数字化浪潮席卷全球的今天,人工智能(AI)技术已成为推动社会进步的重要引擎。尤其是AI大模型,以其强大的数据处理能力和广泛的应用前景,吸引了无数人的目光。然而,对于初学者“小白”来说&#xff0…

面向AI时代的软件开发新范式

作为一名软件开发者,有幸站在了AI时代的风口浪尖。在这篇博客中,我将分享我的个人看法,一起走向AI时代软件开发新范式。 首先,我们要明确软件开发活动产生的各种制品,都是人类知识的载体,也是人类文明的高级…

22种常用设计模式示例代码

文章目录 创建型模式结构型模式行为模式 仓库地址https://github.com/Xiamu-ssr/DesignPatternsPractice 参考教程 refactoringguru设计模式-目录 创建型模式 软件包复杂度流行度工厂方法factorymethod❄️⭐️⭐️⭐️抽象工厂abstractfactory❄️❄️⭐️⭐️⭐️生成器bui…

【Linux】Xshell和Xftp简介_安装_VMware虚拟机使用

1、简介 Xshell简介 Xshell是一款强大的安全终端模拟软件支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。该软件通过互联网实现到远程主机的安全连接,并通过其创新性的设计和特色帮助用户在复杂的网络环境中高效工作。Xshell可以在Windows界面下访问远端不…

阿里云域名解析

阿里云域名控制台:https://dc.console.aliyun.com/next/index#/domain-list/all