본문으로 건너뛰기

외부 바이너리 포함하기

애플리케이션이 작동하도록 하거나 사용자가 추가 종속성(예: Node.js 또는 Python)을 설치하지 않도록 하려면 종속 바이너리를 포함해야 할 수 있습니다. 우리는 이를 sidecar 바이너리라고 부릅니다.

선택한 바이너리를 묶으려면 tauri.conf.jsontauri > bundle 개체 externalBin 속성으로 추가해야 합니다.

tauri.conf.json 구성에 대해 자세한 내용은 here에서 볼수 있습니다.

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

이름이 같고 접미사가 -$TARGET_TRIPLE인 바이너리가 지정된 경로에 있어야 합니다. 예를 들어, "externalBin": ["binaries/my-sidecar"]에는 src-tauri/binaries/my-sidecar-x86_64-unknown-linux-gnu Linux 실행 파일이 필요합니다. You can find the current platform's target triple by looking at the host: property reported by the rustc -Vv command.

If the grep and cut commands are available, as they should on most Unix systems, you can extract the target triple directly with the following command:

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

On Windows you can use PowerShell instead:

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

다음은 타겟 트리플(target triple)을 바이너리에 추가하는 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
})

Javascript에서 실행하기

JavaScript 코드에서 shell 모듈의 Command 클래스를 가져오고 sidecar 정적 메서드를 사용합니다.

shell > scope에 모든 바이너리를 설정하고 shell > sidecar 활성화 하려면, 허용 목록을 구성해야 합니다.

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

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", ...] }

인수 전달하기

일반적인 명령을 실행할 때와 마찬가지로 Sidecar 명령에 인수를 전달할 수 있습니다( [Command API에 대한 액세스 제한][]).

먼저, 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'
// alternatively, use `window.__TAURI__.shell.Command`
// `binaries/my-sidecar` is the EXACT value specified on `tauri.conf.json > tauri > bundle > externalBin`
// notice that the args array matches EXACTLY what is specified on `tauri.conf.json`.
const command = Command.sidecar('binaries/my-sidecar', [
'arg1',
'-a',
'--arg2',
'any-string-that-matches-the-validator',
])
const output = await command.execute()

Sidecar에서 Node.js 사용하기

Tauri sidecar 예제는 sidecar API를 사용하여 Tauri에서 Node.js 애플리케이션을 실행하는 방법을 보여줍니다. pkg를 사용하여 node.js 코드를 컴파일하고 위의 스크립트를 사용하여 실행합니다.

[Command API에 대한 액세스 제한]: /ko/v1/api/js/shell#restricting-access-to- the-command-apis