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

相关推荐

  1. HTTPS什么意思

    2024-06-16 13:48:04       32 阅读
  2. ddp什么意思

    2024-06-16 13:48:04       27 阅读
  3. 服务器OS什么意思?

    2024-06-16 13:48:04       39 阅读
  4. 边缘计算设备什么意思

    2024-06-16 13:48:04       32 阅读
  5. 云原生到底什么意思

    2024-06-16 13:48:04       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 13:48:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 13:48:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 13:48:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 13:48:04       18 阅读

热门阅读

  1. yolov10 学习笔记

    2024-06-16 13:48:04       7 阅读
  2. js面试题

    2024-06-16 13:48:04       7 阅读
  3. ndk-build

    2024-06-16 13:48:04       6 阅读
  4. AI学习指南机器学习篇-KNN基本原理

    2024-06-16 13:48:04       7 阅读
  5. XML XSLT:技术与应用解析

    2024-06-16 13:48:04       5 阅读
  6. 【C++】priority_queue的用法(模板参数的实例)

    2024-06-16 13:48:04       6 阅读
  7. 决策树算法介绍 - 原理与案例实现

    2024-06-16 13:48:04       8 阅读
  8. Web前端设计培训机构:深度解析与实战指南

    2024-06-16 13:48:04       8 阅读
  9. Mysql-题目02

    2024-06-16 13:48:04       6 阅读
  10. Web前端实战教学:深度剖析与技能进阶

    2024-06-16 13:48:04       8 阅读