Tauri のインストーラーをカスタマイズする: Windows 編

# はじめに

Tauri は、ビルドフレームワークに WiX を使ったインストーラー作成を最初から組み込んでいる。
それはつまり `cargo tauri build` や `npm run tauri build` を実行した時点で、実行ファイル (.exe) だけではなく、**インストーラー (.msi (MSI), .exe(NSIS)) を同時に作成してくれる**。

こうした GUI アプリを作成するフレームワークで、最初からインストーラー作成までサポートしていることは珍しくもあるので、この機能が取り込まれていたことに気付いたときは結構感動した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/efc74f98-9f82-0aa8-420d-48756f147c4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/0591d578-fc55-2382-68b9-25068551f0bb.png)


しかしながら、こうして組み込まれていると気になってくるのがカスタマイズ方法。
インストーラーに対して、例えば次のような項目を追加したくなったりする。

* PATH 環境変数に追加するオプション選択
* 追加の依存アプリケーションのインストール案内
* シンボリックリンクの追加
* などなど

こうした際にどういじればインストーラーをカスタイマイズできるのか、また、どこまでいじることができるのかを探ってみようと思った。

### 検証環境

* Windows 11 Pro 23H2
* Tauri 1.5.3
* tauri-cli(Cargo) 1.5.7 

# 基本仕様

公式では次のところにドキュメントがある。

https://tauri.app/v1/guides/building/windows/

記載にある通り、ベースのフレームワークには [WiX (Toolset v3)](https://wixtoolset.org/docs/v3/) と NDIS をそれぞれ使っている。

:::note warn
**WiX についてここでまとめる事の言い訳**
WiX はざっくりとした情報しか知らないので、本当はこちらを体系的に学んだ方がいいのだろうが、このまま「Tauri を題材に学んでいくスタイル」で行く。

NSISも合わせて触ったが、NSISの方がとっつきやすく、ただスクリプトを書くだけで結果を出すのも早かった。

なので、WiX に関しては、一旦おまけということで。
:::

## ビルド方法

npm 系であれば

```powershell
npm run tauri build
```

cargo であれば

```powershell
cargo tauri build
```

## 32-bit や ARM アーキテクチャへの対応

ここら辺についてはまずは、以下の Rust Lang のドキュメントを読んだ方がいい。

https://rust-lang.github.io/rustup/installation/windows.html

### 32-bit 対応

まずは、対応するためのツールチェーンである `i686-pc-windows-msvc` を rustup に追加する必要がある。

```powershell
rustup target add i686-pc-windows-msvc
```

そして、ターゲット (`--target`) に `i686-pc-windows-msvc` を指定してビルドする。

```powershell
cargo tauri build --target i686-pc-windows-msvc
```

### Arm64 対応

Arm64 の場合は、まずは Visual Studio Installer を使用して追加のビルドツール `MSVC v143 - VS 2022 C++ ARM64 build tools (Latest)` (日本語名: `MSVC v143 - VS 2022 C++ ARM ビルドツール (最新)`) をインストールしてくる必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/f20b2b0e-3e3b-7cbe-0d58-2388bb2f662e.png)

加えて rustup にツールチェーンである `aarch64-pc-windows-msvc` を追加する。

```powershell
rustup target add i686-pc-windows-msvc
```

そしてビルド時のターゲットに `` を指定してビルドする。

```powershell
cargo tauri build --target i686-pc-windows-msvc
```

## WebView2 のインストールオプション

WebView2 は Windows におけるフロントエンドの基盤となっているもの。
Tauri の特徴として、Chrominium 等に頼らず、OS ネイティブサポートの Web ビューエンジンを使用して描画しているため、このオプションが存在する。

基本的には、 Windows 10 (2018年4月以降のリリースから最新) and Windows 11 ではデフォルトで OS にバンドルされているので、ここら辺のオプションは気にする必要はない。
しかしながら、Windows 7 等にインストールする際には、このオプションの設定が有効になってくる。

今回は Windows 11 での話をメインに扱うので、一旦リンクだけで説明はスキップする。

https://tauri.app/v1/guides/building/windows/#webview2-installation-options

## Tauri Config でカスタマイズする

Tauri Config の Windows 向け設定として、WixConfig の設定項目が存在する。

https://tauri.app/v1/api/config/#wixconfig

主に以下の様な項目を設定可能。

| アトリビュート | 説明 |
|:-:|:-|
|language|インストーラーで表示する言語設定|
|license|RTF フォーマットでのライセンスレンダー用ファイル設定|
|enableElevatedUpdateTask|アップデートチェックを Windows Task Scheduler に設定|
|bannerPath|インストーラーに表示されるバナー画像を設定。サイズは、493px × 312px 固定で、ビットマップファイル (.bmp) である必要がある。|
|dialogImagePath|開始時と完了時に表示される画像を設定。サイズは、493px × 312px 固定で、ビットマップファイル (.bmp) である必要がある。|

## 独自の WiX テンプレートを使用する

現状、テンプレートのカスタマイズには二通ある。

* ソース .wix ファイルを直接カスタマイズする
* [WiX Fragment](https://wixtoolset.org/docs/v3/xsd/wix/fragment/) として拡張する


### ソース .wix ファイルを直接カスタマイズする

[ソース](https://github.com/tauri-apps/tauri/blob/1.x/tooling/bundler/src/bundle/windows/templates/main.wxs) を直接書き直しつつ、これを適用する。
適用するには、Tauri Config で `tauri.bundle.windows.wix.template` を設定する。

ただ、こちらを設定する場合は先のソースでもいいが、一度 `tauri build` して生成された `main.wxs` ファイルをいじった方が良いと思われる。
ファイルは、 `.\src-tauri\target\release\wix\x64\main.wxs` に、ビルド時に生成される。

以下生成されたものを一部抜粋。
見て通り、ターゲットのパスや開発者グループ名などを設定してくれるので、ソースからの改編の手間が省ける。

:::note info
**パス指定について**
公式ドキュメントを見ると、`.wxs` ファイルまでのパスを POSIX パス (`/`) で記述している様に見える。しかしながら、実際は単に文字列結合を `tauri.config.json` を元に解決しているだけで、POSIX ファイルだとファイル認識してくれず、ビルド時にエラーを起こす。
認識のためには Winsdows Path ( `\\` 文字列上ダブルスラッシュである必要がある。)で記載する必要がある。
Windows のいや～～なところがここでも… :weary:
:::

例えば `.\src-tauri\wix\custom.wxs` として保存して設定する。

```json:tauri.config.json
{
  "tauri": {
    "bundle": {
      "windows": {
        "wix": {
          "template": "wix/custom.wxs",
        }
      }
    }
  }
}
```

### [WiX Fragment](https://wixtoolset.org/docs/v3/xsd/wix/fragment/) として拡張する

```json:tauri.config.json
{
  "tauri": {
    "bundle": {
      "windows": {
        "wix": {
          "fragmentPaths": ["wix/registry.wxs"],
          "componentRefs": ["MyFragmentRegistryEntries"]
        }
      }
    }
  }
}
```

## 独自の [NSIS](https://nsis-dev.github.io) テンプレートを使用する

個人的には WiX と NSIS だと、 NSIS の方が扱いやすい印象を覚えたので、こちらの方を好んで使用するようにしている。

マスターテンプレートは、Tauri レポジトリ内の [ここ](https://github.com/tauri-apps/tauri/blob/1.x/tooling/bundler/src/bundle/windows/templates/installer.nsi)から手に入るので、使用している Tauri CLI のバージョンと合ったブランチに切り替えてダウンロードする。

```json:tauri.config.json
{
  "tauri": {
    "bundle": {
      "windows": {
        "nsis": {
          "template": "nsis/template.nsi"
        }
      }
    }
  }
}
```

:::note info**トラブルシュート**

例えば、次の様なエラーが NSIS ビルド時に発生する。

```
Error failed to bundle project: `Error rendering "installer.nsi" line 549, col 36: Helper not defined: "unescape-dollar-sign"`
```

こういった原因は、Tauri CLI のバージョンが、古いことが多い。

以下のような形で Tauri CLI を最新にしておくことをおススメする。

```powershell
cargo install tauri-cli
```
:::



# インストーラーのターゲットを絞る

デフォルトでは WiX と NSIS の両方のインストーラーを作成する振る舞いをする。
しかしながら、いざ NSIS だけで運用すると決めたら WiX ベースのインストーラーはわざわざ作成する必要がなくなってくる。

この場合は、`tauri.config.json` の `tauri.bundle.targets` を変更する。
デフォルトでは、 `"all"` という文字列になっているが、これを配列にしてそれぞれ選択していく。
例えば、NSIS のみとする場合は、 `["nsis"]` といった感じ。

Windows のみ NSIS に変える、しかし他のプラットフォームはそのままという場合は、そのまま並べて書く。

```json:tauri.config.json
{
  "tauri": {
    "bundle": {
      "targets": ["deb", "appimage", "nsis", "app", "dmg", "updater"]
    }
  }
}
```


# まとめ

そもそもインストーラー作成がフレームワークに含まれている事自体個人開発ではありがたいのだが、カスタマイズしやすいような導線も貼られていて調べやすかった。
こういう整備環境が充実しているところも Tauri 好きだなぁ～、と思うところだなと感じた。