Contents
Tauriでデスクトップアプリ開発を始める前に
フロントエンドエンジニアがRust backendに挑戦する意義
Tauriは、Web技術で構築されたUIとRust製のバックエンドを組み合わせてデスクトップアプリを開発できるフレームワークです。本記事では、「Tauri Rust バックエンド 入門 チュートリアル」というキーワードに沿い、フロントエンド技術者がRustでバックエンド開発を始める具体的な手順を解説します。
Rustは安全性とパフォーマンスが高く、デスクトップアプリのコア処理に適しています。一方で、フロントエンドエンジニアにとってRustの学習曲線は急ですが、Tauriの仕組みを理解することで、既存のJavaScriptスキルを活かして開発が可能です。以下では、環境構築から実装例まで、体系的に解説します。
Tauri環境の初期セットアップ
yarn create tauri-appによるプロジェクト生成
Tauriアプリケーションを作成するには、まずyarn create tauri-appコマンドを用いたプロジェクト生成が基本です。この方法は公式ドキュメントにも記載されており、以下のような手順で進められます。ただし、公式ではcreate-tauri-appというパッケージを使用するため、以下の注意点があります。
注意:
yarn create tauri-appは公式が推奨する方法ですが、npm init tauri@latestやcargo tauri newも選択肢として存在します。開発スタイルに応じて使い分けてください。
- Node.jsとyarnのインストール確認
node -vとyarn -vでバージョンをチェックし、最新版か確認してください。-
プロジェクト生成コマンドの実行
bash
yarn create tauri-app my-tauri-app -
テンプレート選択
Web技術(React/Vueなど)を選択し、Rust側に必要な構成ファイルが自動生成されます。
プロジェクト作成後は、cd my-tauri-appでディレクトリへ移動し、yarn tauri devで開発環境を起動できます。
Rustツールチェーンのインストール確認
TauriアプリケーションではRustが必須です。以下のようにしてインストール状況を確認してください。
-
rustcバージョンの確認
bash
rustc --version -
最低でも
1.70以上が必要です(2023年現在の最新版推奨)。 - cargoのインストール
cargo install tauri-cliでTauri CLIを追加すると、ビルドやデバッグが容易になります。
注意: インストールに失敗した場合は、Rust公式サイトから最新版をインストールしてください。
フロントエンドとRustコードの連携方法
Tauri CLIによる構造確認
Tauriプロジェクトでは、tauriコマンドで構造を確認できます。例えば、yarn tauri devで起動すると、以下のようなファイル構成が生成されます。
| ファイル/ディレクトリ | 説明 |
|---|---|
src-tauri/ |
RustコードとTauri設定が配置されるフォルダ |
Cargo.toml |
Rustプロジェクトの依存関係や構成を記載 |
main.rs |
Rustのエントリポイントファイル |
この構造を理解することで、後述する通信処理の実装がスムーズになります。
フロントエンドからRust関数呼び出しの仕組み
JavaScriptからRust関数を呼び出すには、@tauri-apps/apiライブラリを使用します。簡単な例として、以下のコードでRust側の関数を呼び出せます。
|
1 2 3 4 5 6 7 8 9 10 11 |
import { invoke } from '@tauri-apps/api'; async function callRustFunction() { try { const result = await invoke('greet', { name: 'World' }); console.log(result); } catch (error) { console.error(`エラー発生: ${error.message}`); } } |
Rust側では、#[tauri::command]アノテーションで関数を定義します。
|
1 2 3 4 5 6 7 |
use tauri::{Command, State}; #[tauri::command] fn greet(name: String) -> String { format!("Hello, {}!", name) } |
このようにして、JavaScriptとRust間で双方向の通信が可能です。
バックエンド処理の実装例とテスト方法
ファイル操作のRust実装サンプル
ファイルを読み込むシンプルな例として、以下のコードが挙げられます。
|
1 2 3 4 5 6 7 8 9 10 |
use std::fs; #[tauri::command] fn read_file(path: String) -> Result<String, String> { match fs::read_to_string(&path) { Ok(content) => Ok(content), Err(e) => Err(format!("ファイル読み込み失敗: {}", e)), } } |
フロントエンドでは、以下のように呼び出せます。
|
1 2 |
invoke('read_file', { path: '/test.txt' }).then(console.log); |
API通信機能の簡易実装
HTTPリクエストを送信する処理も可能です。reqwestライブラリを使用した例です。
|
1 2 3 4 5 6 7 8 |
use reqwest::Error; #[tauri::command] async fn fetch_data(url: String) -> Result<String, Error> { let response = reqwest::get(&url).await?; Ok(response.text().await?) } |
注意: reqwestは非同期処理でエラーを返すため、JavaScript側では.catch()でエラーハンドリングを行う必要があります。
テストはyarn tauri devで起動中のアプリに手動で呼び出しを行い、コンソールの出力やエラーメッセージを確認します。
マルチプラットフォーム開発時の注意点
ビルド設定ファイルのカスタマイズ
TauriはWindows/macOS/Linuxに対応しており、tauri.conf.jsonで各プラットフォームごとの設定を指定できます。以下に具体的な手順と例を示します。
src-tauri/tauri.conf.jsonを開き、以下のセクションを編集:-
リソースのコピー先指定:
json
"build": {
"resources": ["./assets/*"],
"wasm-tracing": false,
"targets": [
"linux-x86_64",
"macos-aarch64",
"windows-x86_64"
]
} -
プラットフォーム固有の設定:
- macOSでは
"icon": "icons/icon.icns"、Windowsでは"icon": "icons/icon.ico"を指定。 - デバッグモードの有効化(開発時は
"dev": trueに)。
例: Windowsで特定のDLLを使用する場合、
"external-binaries": ["path/to/dll"]を追加。
OS固有処理の実装方法
プラットフォームごとの処理が必要な場合は、Rustのcfg!()マクロで条件分岐します。例えば、以下のようにしてWindowsとmacOSを区別できます。
|
1 2 3 4 5 6 7 8 9 10 11 |
#[tauri::command] fn get_os() -> String { if cfg!(target_os = "windows") { "Windows".to_string() } else if cfg!(target_os = "macos") { "macOS".to_string() } else { "Other OS".to_string() } } |
本格的なバックエンド開発への道筋
パッケージ管理の最適化
RustではCargo.tomlで依存関係を管理します。アプリケーションに必要なライブラリ(例: serde, tokio)は以下のように記述します。
|
1 2 3 4 |
[dependencies] serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.0", features = ["full"] } |
セキュリティ対策の基本
Tauriアプリでは以下の点に注意が必要です。
- 権限制限: 不要なファイルアクセスやネットワーク通信を禁止
- サンドボックス化: ユーザーのシステムへの影響範囲を最小限に(例:
seccomp-bpfでシステムコール制限) - コード署名: Windows/macOSでの配布時に信頼性確保(例:
sigstoreライブラリによる署名実装)
具体例:
rust
// サンドボックス化の簡易例 (seccomp-bpf利用)
use seccomp::{Seccomp, Syscall};fn setup_sandbox() {
let mut filter = Seccomp::new().unwrap();
filter.add_rule(Syscall::read, 0).unwrap(); // 読み込みのみ許可
filter.load().unwrap();
}
公式ドキュメントと併用しながら、実際にプロジェクトを作成してみましょう。
セキュリティ対策の具体例
コード署名の実装方法(Windows/macOS向け)
-
sigstoreライブラリを使用:
toml
[dependencies]
sigstore = "0.4" -
署名処理コード例:
rust
use sigstore::{Signer, Certificate};
fn sign_binary(binary: &[u8]) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let signer = Signer::new()?;
Ok(signer.sign(&binary)?)
}
サンドボックス化の実装方法
-
Linux:
seccomp-bpfでシステムコール制限
rust
use seccomp::{Seccomp, Syscall};
fn setup_sandbox() {
let mut filter = Seccomp::new().unwrap();
filter.add_rule(Syscall::execve, 0).unwrap(); // execve禁止
filter.load().unwrap();
} -
Windows:
Windows SandboxやAppContainerの利用
マルチプラットフォーム開発時の注意点(続き)
各OSの特徴と対応策比較
| OS | 特徴 | 対応策 |
|---|---|---|
| macOS | アプリケーションバンドル必要 | icon.icnsを指定、Gatekeeper対策 |
| Windows | UACとデスクトップパス制限 | 仮想環境でのビルド推奨(WSLなど) |
| Linux | ディストリビューション依存性 | パッケージ管理ライブラリ(dpkg, rpm) |
各OSで動作確認を実施し、ローカル開発環境と配布時の差異を把握してください。
開発手順の最適化
Tauriアプリのビルドフロー(ステップバイステップ)
-
開発モードでの起動:
bash
yarn tauri dev -
実行ファイル生成:
bash
yarn tauri build -
配布用パッケージ作成:
bash
yarn tauri build --target windows-x86_64
まとめと今後の方向性
TauriはWeb技術を活かしたデスクトップアプリ開発に最適なツールですが、Rustのエコシステムやセキュリティ対策に注力する必要があります。特に非同期処理でのエラーハンドリング、マルチプラットフォーム設定のカスタマイズ、コード署名やサンドボックス化の実装は必須です。本記事で解説した内容をもとに、実際にプロジェクトを作成し、開発スキルを高めてください。