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

news2024/12/26 7:10:01

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命令,并执行它。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW常用的加密硬件

LabVIEW在工程和科学领域中广泛应用,其中数据保护和程序安全尤为重要。为了确保数据的安全性和完整性,常用的加密硬件设备包括TPM(可信平台模块)、HSM(硬件安全模块)和专用加密芯片。本文将推荐几款常用的加…

[DDR4] DDR 简史

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 存和硬盘,这对电脑的左膀右臂,共同扛起了存储的重任。内存以其超凡的存取速度闻名,但一旦断电,内存中的数据也会消失。它就像我们的工作桌面&…

Python基础用法 之 变量

1.变量的定义 变量的作用:是⽤来保存数据的。定义的语法:变量名 数据值使用:直接使⽤变量名 即可使⽤变量中存储的数据。注意:变量必须先定义后使用。 (即 必须 先存⼊数据 才能 获取数据) 。 # 需求 1, 定义⼀个变量 保存你的名…

(超详细)基于动态顺序表实现简单的通讯录项目

前言: 我们在上一章节用c语言实现了线性表中的的动态顺序表,那么顺序表就只是顺序表吗?当然不是,使用顺序表结构可以实现很多项目,许多项目的数据结构都会用到顺序表,本章节我们就要使用顺序表实现一个简易…

爬虫案例:建设库JS逆向

爬虫流程 1. 确定目标网址和所需内容 https://www.jiansheku.com/search/enterprise/ 只是个学习案例,所以目标就有我自己来选择,企业名称,法定代表人,注册资本,成立日期 2. 对目标网站,进行分析 动态…

win10没有Hyper-v的解决方法

win10没有Hyper-v的解决方法 问题:最近想装下docker,但是在控制面板-程序-启用或关闭Windows功能下找不到Hyper-v节点。 废话不多说,直接上实操教程 1.将下面命令复制到文本文档中,并将文档重命名Hyper.cmd pushd "%~dp0&q…

29.添加录入注入信息界面

上一个内容:28.启动与暂停程序 以 28.启动与暂停程序 它的代码为基础进行修改 效果图: 新建Dialog 给新建的dialog添加空间,如下图 给每个输入框创建一个变量 代码: void CWndAddGame::OnBnClickedButton1() {static TCHAR BASE…

Go如何在本地引用以及发布并引用自定义工具包

如何引用本地自定义工具包 我们首先要准备两个项目,分别为需要引入的工具包和当前项目。 myutils、myproject1. myutils为我们的项目1-工具包 package mypakgeimport "strings"func IsContains(s string) bool {if strings.Contains(s, "a")…

HAL库开发--定时器的配置方式和占空比输出

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求 Timer配置 分频系数 Timer编码 总结 前言 定时器(Timer)在嵌入式系统中是一种重要的硬件资源,常用于生成精确的时间延迟、周期性触发事件或产生PWM信号等应用。本文将…

排序算法!

文章目录 插入排序冒泡排序选择排序归并排序希尔排序 提示:本文分析算法复杂度时,默认目标是n个元素升序排序,代码注释已经写好,就不单独拎出来了 插入排序 插入排序就是把待排序序列的第一个元素看作是有序序列,把第…

Internet Download Manager(IDM6.41)软件安装包下载及安装教程

Internet Download Manager有一个智能下载逻辑加速器,具有智能动态文件分割和安全的多部分下载技术,可以加速下载。与其他下载加速器和管理器不同,Internet下载管理器在下载开始之前对文件进行分段,而Internet下载管理器在下载过程…

华为云下Ubuntu20.04中Docker的部署

我想用Docker拉取splash,Docker目前已经无法使用(镜像都在国外)。这导致了 docker pull 命令的失败,原因是timeout。所以我们有必要将docker的源设置在国内,直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…

AMD Lisa Su专访:谈与英伟达、Intel竞争 直言Arm不是敌人

AMD CEO Lisa Su(苏姿丰)绝对称得上是芯片届的风云人物,尤其是进入了AI新时代,她的声望达到了十年来最高点。翻看其成长历史,苏姿丰在麻省理工学院获得电气工程博士学位后(在麻省理工学院学习八年半&#x…

【Ardiuno】实验使用OPT语音模块播放语音(图文)

当我们需要在程序中播放语音内容时,就需要使用到语音模块,今天我们就来实验一下使用OPT语音模块来方法语音。 const int voicePin 5; const int voiceBusyPin 18; const int testLEDPin 2;unsigned long pmillis 0;int busyVal 0; …

C#联合Halcon机器视觉框架源码—升级版

相较于之前的NxtVision,本软件代码架构更加合理,且新增ui设计器、原来的vb脚本改为C#脚本,并尝试将视觉与运动控制相结合,是一体化的框架。 对源码有需求的,订阅本专栏后,私信我领取。

安卓网络通信(多线程、HTTP访问、图片加载、即时通信)

本章介绍App开发常用的以下网络通信技术,主要包括:如何以官方推荐的方式使用多线程技术,如何通过okhttp实现常见的HTTP接口访问操作,如何使用Dlide框架加载网络图片,如何分别运用SocketIO和WebSocket实现及时通信功能等…

记录一次centos扩容

背景 在Vscode上连虚拟机写项目,突然提示磁盘空间不足(no space left on device),一开始打算删些东西,这里参考博客,写得挺清楚的,但是操作后我发现实在没啥文件可以删除,所以干脆不删了,直接扩…

Centos实现Mysql8.4安装及主主同步

8.4的Msyql在同步的时候与之前的版本有很大不同,这里记录一下安装流程 Mysql安装 官网下载 选择自己的版本,选第一个 复制下载链接 在服务器上创建一个msyql目录 使用命令下载,链接换自己的 wget https://dev.mysql.com/get/mysql84-community-relea…

【分布式计算】java消息队列机制

消息队列是一种在不同组件或应用之间进行数据传递的技术,通常用于处理异步通信。它允许消息的发送者(生产者)和接收者(消费者)之间进行解耦。 概念 消息队列是一种先进先出(FIFO)的数据结构&…

【react小项目】bmi-calculator

bmi-calculator 目录 bmi-calculator初始化项目01大致布局01代码 02完善样式02代码 03输入信息模块03代码 04 使用图表04代码 05详细记录信息渲染05代码 06 让数据变成响应式的06-1输入框的数据处理06-2图表,和记录信息的区域数据处理 07 删除功能,撤销功…