アプリと Tauri のバージョン番号を取得する

getVersion() と getTauriVersion()、Rust の package_info() と tauri::VERSION でアプリと Tauri の版を取得し、About 画面に出す。version の一元管理も示す。

システム情報 対象: Tauri 2.x 更新日: 読了目安: 約7分 sys-015
目次
  1. 前提条件
  2. 1. フロントエンドから実装する (TypeScript)
  3. 2. バックエンドから実装する (Rust)
  4. アプリのバージョン番号を 1 か所で管理する
  5. 開発環境全体の版を確認する
  6. 動作確認
  7. よくあるエラーと対処法
  8. OS ごとの違いと注意点
  9. 関連レシピ

About ダイアログやバグ報告フォームに「アプリ 1.4.2 / Tauri 2.8.5 / WebView2 140.x」のような環境情報を出しておくと、問い合わせ対応が一気に楽になります。アプリ自身のバージョンは @tauri-apps/api/app の getVersion()、Tauri コアのバージョンは同じモジュールの getTauriVersion() で取れ、getName() / getIdentifier() と組み合わせて表示します。Rust 側では package_info() と tauri::VERSION 定数を使います。

前提条件

プラグインは不要です。権限は core:app:default に含まれる次の 4 つで、core:default を有効にしていれば追加設定なしで使えます。個別に絞る場合はこの識別子を書きます。

{
  "permissions": [
    "core:app:allow-tauri-version",
    "core:app:allow-version",
    "core:app:allow-name",
    "core:app:allow-identifier"
  ]
}

1. フロントエンドから実装する (TypeScript)

import { getTauriVersion, getVersion, getName, getIdentifier } from '@tauri-apps/api/app';

export async function buildAboutText(): Promise<string> {
  const [tauri, version, name, id] = await Promise.all([
    getTauriVersion(), // Rust 側 tauri クレートの版 (例: "2.8.5")
    getVersion(),      // tauri.conf.json の version (例: "1.4.2")
    getName(),         // tauri.conf.json の productName
    getIdentifier(),   // 例: "com.example.myapp" (2.4.0 以降)
  ]);
  return `${name} ${version} (${id})\nTauri ${tauri}`;
}

注意したいのは、getTauriVersion() が返すのは Rust クレート tauri の版 であって、package.json の @tauri-apps/api の版ではない点です。両者は独立して更新されるため、2.8.x と 2.9.x のように食い違うのは普通です。JS 側の版も併記したいなら Vite の define などでビルド時に埋め込みます。

2. バックエンドから実装する (Rust)

WebView の版は tauri::webview_version() で取れるので、環境情報は Rust で一括生成すると 1 回の invoke で済みます。

use serde::Serialize;
use tauri::Manager;

#[derive(Serialize)]
struct EnvInfo {
    app_name: String,
    app_version: String,
    tauri_version: String,
    webview_version: String,
    os: String,
}

#[tauri::command]
fn env_info(app: tauri::AppHandle) -> EnvInfo {
    let pkg = app.package_info(); // name / version / authors / description / crate_name
    EnvInfo {
        app_name: pkg.name.clone(),
        app_version: pkg.version.to_string(), // semver::Version なので to_string
        tauri_version: tauri::VERSION.to_string(),
        webview_version: tauri::webview_version().unwrap_or_else(|_| "unknown".into()),
        os: format!("{} {}", std::env::consts::OS, std::env::consts::ARCH),
    }
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![env_info])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
import { invoke } from '@tauri-apps/api/core';

type EnvInfo = { app_name: string; app_version: string; tauri_version: string; webview_version: string; os: string };
const info = await invoke<EnvInfo>('env_info');
console.log(`${info.app_name} ${info.app_version} / Tauri ${info.tauri_version} / WebView ${info.webview_version}`);

tauri::VERSION は &'static str の定数で、Cargo.lock で解決された版がコンパイル時に埋め込まれます。package_info().version は tauri.conf.json の version(未設定なら Cargo.toml の version)です。

アプリのバージョン番号を 1 か所で管理する

getVersion() が返す値もビルド時に埋め込まれます。package.json や Cargo.toml と別々に書くと食い違いやすいので、tauri.conf.json の version には package.json へのパスも書けるようになっています。次のようにすると package.json の version が使われ、npm version patch だけでアプリの版が上がります。

{
  "productName": "My App",
  "version": "../package.json",
  "identifier": "com.example.myapp"
}

productName を省略すると、getName() は Cargo のパッケージ名を返します。Rust の env!("CARGO_PKG_VERSION") は常に Cargo.toml の値なので、tauri.conf.json 側で版を管理しているなら package_info().version を使います。どちらもビルド時に決まる値なので、書き換えたら tauri dev を起動し直します。

package_info().version は semver の型で、major / minor / patch を数値として比べられます。JS で "1.10.0" > "1.9.0" のように文字列のまま比べると結果が逆になるので、「更新後の初回だけお知らせを出す」といった判定は数値に分けてから行います。

開発環境全体の版を確認する

手元の環境を調べるなら CLI が一番速いです。Rust / Node / Tauri CLI / tauri クレート / @tauri-apps/api / WebView2 ランタイムの版が一覧で出ます。バグ報告に貼るのはこの出力です。

npm run tauri info

動作確認

npm run tauri dev で起動し、コンソールに次のように出れば成功です。

MyApp 0.1.0 (com.example.myapp)
Tauri 2.8.5

src-tauri で cargo update -p tauri を実行して再起動すると getTauriVersion() の値が変わります。package.json 側だけ更新しても変わらないことを確かめると、前述の違いが体感できます。

よくあるエラーと対処法

  • app.tauri_version not allowed. Permissions associated with this command: core:app:allow-tauri-version, ... という趣旨のエラー: core:default(または core:app:default)を外して個別指定にしたときに起きます。上記 4 つの識別子を追加します。
  • getIdentifier がエクスポートされていないという TypeScript エラー: @tauri-apps/api が 2.4.0 より古い状態です。npm install @tauri-apps/api@latest で更新します。
  • tauri info が @tauri-apps/api と tauri の版の不一致を警告する: 動作はしますが、新しい JS API を呼んだときに Rust 側にコマンドが無く実行時エラーになります。Tauri CLI を最新版にアップグレードする の手順で両方揃えます。

OS ごとの違いと注意点

  • WebView の版の意味が OS ごとに違う: Windows は WebView2 ランタイム(Edge と同じ番号)、macOS は WebKit(OS のアップデートで変わる)、Linux は WebKitGTK のパッケージ版です。同じ Tauri 版でも描画の差はここに起因することが多いので、必ず併記します。
  • tauri::VERSION はビルド時に固定: ユーザー環境で変わることはありません。逆に WebView の版は OS 更新で勝手に変わります。
  • モバイル: getName() / getVersion() は Android / iOS でも同じ API で取得できます。
  • インストーラーの版: Windows の MSI の版は version から作られ、メジャーとマイナーは 255、パッチは 65,535 が上限です。2026.9.12 のような日付の版は MSI では通らないので、bundle.windows.wix.version で別に指定します。macOS のビルド番号は bundle.macOS.bundleVersion で version と別に付けられます。

関連レシピ

参考リンク(公式ドキュメント)

Web Ninja

この記事を書いた人

Web Ninja ウェブエンジニア (Web Engineer)

会社員ネットワークエンジニアから独立してかれこれ 25 年以上 Web エンジニアとして活動中。普段は JavaScript と Node.js を自在に操り、時には C++ や Perl といった古流の技も嗜みます。近年は Tauri × Rust という新たな武器を手に、デスクトップアプリ開発の最前線を駆け抜けています。「作りたい」を「作れる」に変えるための、実践的な「技」をお届けします。

お問い合わせ: tauri.ninja@gmail.com

内容の誤り・動かないコードを報告する