2022年3月23日水曜日

Tauri アプリ入門 2 - レンダープロセスからメインプロセスへ通信

Vanilla.js のプロジェクトを作って、「レンダープロセス -> メインプロセス」の通信を実装するところまで。

前提

コンテナ起動

WSL2 上の Ubuntu で、以下コマンドを実行。

docker run -it --rm -v "$(pwd):/work" --workdir "/work" --name tauri \
    -e  DISPLAY=:0 \
    -e  WAYLAND_DISPLAY=wayland-0 \
    -e  XDG_RUNTIME_DIR=/tmp/wslg/runtime-di \
    -e  PULSE_SERVER=/mnt/wslg/PulseServer \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /mnt/wslg:/mnt/wslg \
    -v $HOME/.cargo:/home/node/.cargo \
    mikoto2000/tauri:latest

プロジェクトひな形の作成

create-tauri-app コマンドで Tauri アプリのひな形を作る。

今回は、 Vanilla.js で作成。

プロジェクト作成

$ npx create-tauri-app
Need to install the following packages:
  create-tauri-app
Ok to proceed? (y) y

We hope to help you create something special with Tauri!
You will have a choice of one of the UI frameworks supported by the greater web tech community.
This tool should get you quickly started. See our docs at https://tauri.studio/

If you haven't already, please take a moment to setup your system.
You may find the requirements here: https://tauri.studio/docs/getting-started/setting-up-linux/

Press any key to continue...
? What is your app name? tauri-app-render2main
? What should the window title be? Tauri App Render2Main
? What UI recipe would you like to add? Vanilla.js (html, css, and js without the bundlers)
>> Running initial command(s)
>> Installing any additional needed dependencies

added 2 packages, and audited 3 packages in 2s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

added 3 packages, and audited 6 packages in 6s

3 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
>> Updating "package.json"
>> Running "tauri init"

> tauri
> tauri "init" "--app-name" "tauri-app-render2main" "--window-title" "Tauri App Render2Main" "--dist-dir" "../dist" "--d
ev-path" "../dist"

>> Updating "tauri.conf.json"
>> Running final command(s)

    Your installation completed.

    $ cd tauri-app-render2main
    $ npm install
    $ npm run tauri dev

npm notice
npm notice New minor version of npm available! 8.1.2 -> 8.5.5
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.5.5
npm notice Run npm install -g npm@8.5.5 to update!
npm notice

ひな形の実行確認

cd tauri-app-render2main
npm install
npm run tauri dev

以下のウィンドウが表示されれば OK.

プロジェクトのファイル構成確認

Node のプロジェクト内に Cargo のプロジェクトが入っている状態。

tauri-app-render2main/
    +- node_modules/
    +- package-lock.json
    +- package.json
    +- dist/                : フロントエンド(レンダープロセス)の成果物
    |   +- index.html
    +- src-tauri/           : バックエンド(メインプロセス)のプロジェクト
        +- src/             : rust ソースコード
        |    +- main.rs
        +- .gitignore
        +- tauri.conf.json  : Tauri プロジェクト設定ファイル
        +- icons/
        +- Cargo.lock
        +- Cargo.toml
        +- target/
        +- build.rs

レンダープロセスからメインプロセスの関数を呼び出す

Tauri では、レンダープロセスからメインプロセスを呼び出すために、「コマンド」システムを提供しているので、それを利用して実装する。

手順は以下の通り、それぞれ説明していく。

  1. メインプロセス側の関数を実装
  2. 「レンダープロセスから関数呼び出しをするよ」という宣言を追加
  3. レンダープロセスに、メインプロセスを呼び出す処理を追加

メインプロセス側の関数を実装

レンダープロセスから呼び出される関数(Tauri command)を追加する。

今回は、 src-tauri/src/command.rs という名前でモジュールを作り、そこに実装する。

use tauri;

#[tauri::command]
pub fn echo(message: String) -> String {
    println!("メッセージ「{}」を受け取りました", message);
    return message;
}

「レンダープロセスから関数呼び出しをするよ」という宣言を追加

src-tauri/src/main.rs にモジュール使用宣言を行い(mod command;)、 tauri::Builder::default() のメソッドチェーンに invoke_handler を追加する。

#![cfg_attr(
  all(not(debug_assertions), target_os = "windows"),
  windows_subsystem = "windows"
)]

mod command; // 使用モジュールの宣言

fn main() {
  tauri::Builder::default()
    .invoke_handler(tauri::generate_handler![command::echo]) // 作成した関数をレンダープロセスから呼び出すという宣言
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}

レンダープロセスに、メインプロセスを呼び出す処理を追加

Vanilla.js の場合、 import を使うのが難しいため、 tauri.conf.json で build.withGlobalTauri のプロパティを追加して、 true を設定する。

これにより、window オブジェクト下に、 Tauri 関連のオブジェクトがぶら下がる。

レンダープロセスからメインプロセスへの呼び出し関数は、 window.__TAURI__.invoke という名前でアクセスできる。

dist/index.html の head タグ末尾に以下コードを追加する。

  <script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function() {
        const invoke = window.__TAURI__.invoke;
        async function callEcho(str) {
            // メインプロセスからメッセージを取得
            let message = await invoke('echo', {message: str});

            // メインプロセスから取得したメッセージをコンソールへ表示
            console.log(message);

            // メインプロセスから取得したメッセージを h1 へ設定
            document.querySelector('h1').textContent = message;
        }
        callEcho('Hello, Tauri!!!');
    });
  </script>

ここまで完了したら、 npm run tauri dev を実行しなおす。

以下 2 点が反映されていれば OK.

  1. npm run tauri dev を実行したコンソールに メッセージ「Hello, Tauri!!!」を受け取りました と表示される
  2. 表示されたウィンドウにのラベルが、 Hello, Tauri!!! に変更されている

以上。

参考資料

2022年3月22日火曜日

Docker の node コンテナで Tauri アプリに入門する

Rust 版 Electron の Tauri に入門する。プロジェクトのひな形を作るところまで。

前提

node のコンテナを起動

WSL2 上の Ubuntu で、以下コマンドを実行。

docker run -it --rm -v "$(pwd):/work" --workdir "/work" --name node \
    -e  DISPLAY=:0 \
    -e  WAYLAND_DISPLAY=wayland-0 \
    -e  XDG_RUNTIME_DIR=/tmp/wslg/runtime-di \
    -e  PULSE_SERVER=/mnt/wslg/PulseServer \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /mnt/wslg:/mnt/wslg \
    -v $HOME/.cargo:/home/node/.cargo \
    node bash
  • Docker Desktop で GUI を動かすために必要な設定
    • -e DISPLAY=:0
    • -e WAYLAND_DISPLAY=wayland-0
    • -e XDG_RUNTIME_DIR=/tmp/wslg/runtime-di
    • -e PULSE_SERVER=/mnt/wslg/PulseServer
    • -v /tmp/.X11-unix:/tmp/.X11-unix
    • -v /mnt/wslg:/mnt/wslg
  • Cargo からダウンロードしたものをキャッシュするディレクトリをマウントすることで、次回以降のプロジェクト作成時間短縮を図る
    • -v $HOME/.cargo:/home/node/.cargo

Tauri の環境構築

システムの依存を apt コマンドでインストール

apt update
apt install -y libwebkit2gtk-4.0-dev \
    build-essential \
    curl \
    wget \
    libssl-dev \
    libgtk-3-dev \
    libappindicator3-0.1-cil-dev \
    librsvg2-dev

node ユーザーへ切り替え

パッケージのインストールが完了したので、ここからは node コンテナに既に存在している node ユーザーで作業を行う。

su node

Rust のインストール

以下コマンドを実行し、インストーラーの指示に従ってインストール。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup-setup.sh
chmod u+x rustup-setup.sh
./rustup-setup.sh -y

インストールが完了したら、以下コマンドで rust 関連コマンドにパスを通す。

source $HOME/.cargo/env

Tauri アプリの作成

create-tauri-app コマンドで Tauri アプリのひな形を作る。

今回は、 Vanilla.js で作成。

# npx create-tauri-app
Need to install the following packages:
  create-tauri-app
Ok to proceed? (y) y

We hope to help you create something special with Tauri!
You will have a choice of one of the UI frameworks supported by the greater web tech community.
This tool should get you quickly started. See our docs at https://tauri.studio/

If you haven't already, please take a moment to setup your system.
You may find the requirements here: https://tauri.studio/docs/getting-started/setting-up-linux/

Press any key to continue...
? What is your app name? tauri-app-firststep
? What should the window title be? Tauri App Firststep
? What UI recipe would you like to add? Vanilla.js (html, css, and js without the bundlers)
>> Running initial command(s)
>> Installing any additional needed dependencies

added 2 packages, and audited 3 packages in 3s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

added 3 packages, and audited 6 packages in 5s

3 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
>> Updating "package.json"
>> Running "tauri init"

> tauri
> tauri "init" "--app-name" "tauri-app-firststep" "--window-title" "Tauri App Firststep" "--dist-dir" "../dist" "--dev-pa
th" "../dist"

>> Updating "tauri.conf.json"
>> Running final command(s)

    Your installation completed.

    $ cd tauri-app-firststep
    $ npm install
    $ npm run tauri dev

Tauri アプリの実行

cd tauri-app-firststep
npm install
npm run tauri dev

これで、 Tauri アプリが起動する。

今回の手順を元に作った Docker イメージを以下に作成した。

以上。

参考資料

2022年3月15日火曜日

Windows の Docker Desktop で、 GUI アプリを動かす

Debian コンテナで xeyes を実行し、目玉を確認するところまで。

前提

事前準備

Docker Desktop の WSL Integration を有効にする

Docker Desktop では、 WSL2 ディストリビューションから Docker Desktop の Docker Engine へアクセスするための仕組み「WSL Integration」を提供している。

WSL Integration を有効にすることで、 WSL ディストリビューション内で docker コマンドが実行可能となり、そのコマンドで Docker Desktop の Docker Engine へアクセスできるようになる。

  1. タスクトレイ内の Docker アイコン右クリック -> Setting -> Resources -> WSL INTEGRATION を選択
    • Docker を実行する WSL2 ディストリビューションを選択
    • 今回は、デフォルトディストリビューションの Ubuntu-20.04 を利用するため、 Enable integration with my default WSL distro にチェックを入れる

Docker で GUI アプリを実行

Debian コンテナをで、 xeyes を実行する。

WSL ディストリビューション起動

WSL2 ディストリビューションの、 Ubuntu-20.04 を起動。

コンテナ起動

WSL2 のディストリビューションには、 WSLg で GUI を実行するための環境変数とディレクトリが用意されている。 それをマウントしながら Docker コンテナを起動する。

Ubuntu 上で以下コマンドを実行。

docker run -it --rm \
    -e  DISPLAY=$DISPLAY \
    -e  WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
    -e  XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
    -e  PULSE_SERVER=$PULSE_SERVER \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /mnt/wslg:/mnt/wslg \
    debian bash

WSLg に必要な環境変数・ディレクトリは以下 6 つ。

  • -e DISPLAY=$DISPLAY
  • -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY
  • -e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
  • -e PULSE_SERVER=$PULSE_SERVER
  • -v /tmp/.X11-unix:/tmp/.X11-unix
  • -v /mnt/wslg:/mnt/wslg

xeyes をインストールして実行

起動した Debian コンテナ上で以下コマンドを実行。

apt update
apt install -y x11-apps
xeyes

これで、Windows 上に、 xeyes の目玉が表示されるはず。

参考資料