MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Tauriの基礎 - 自動アップデートのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Tauriの基礎 - 自動アップデート
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Tauriの自動アップデート機能 (updater) は、デスクトップアプリケーションにシームレスな更新体験を提供する公式プラグインである。<br> <br> このプラグインを使用することで、ユーザはアプリケーションを手動で再インストールすることなく、最新バージョンへの更新が可能となる。<br> <br> updaterプラグインの主な特徴は以下の通りである。<br> * セキュリティ *: 署名検証により、改ざんされていない正規の更新パッケージのみをインストールする。 * クロスプラットフォーム *: Linux、Windows、MacOSの全プラットフォームで動作する。 * 柔軟なサーバ構成 *: 静的ファイルサーバ、GitHub Releases、独自のAPIサーバ等に対応する。 * 進捗表示 *: ダウンロード進捗をリアルタイムで取得し、UIにフィードバックできる。 * カスタマイズ可能なフロー *: 更新チェックのタイミング、インストールの実行をアプリケーションの要件に合わせて制御できる。 <br><br> == updaterプラグインの導入 == updaterプラグインを使用するには、Rustバックエンドとフロントエンドの両方にパッケージを追加して、設定ファイルを構成する必要がある。<br> <br> ==== インストール ==== updaterプラグインをインストールするには、以下に示す3つの手順を実行する。<br> <br> ===== Rust側のインストール ===== <code>tauri add</code> コマンドを実行してプラグインを追加する。<br> <br> # Tauri CLIを使用してupdaterプラグインを追加 pnpm tauri add updater # またはnpmを使用する場合 npm run tauri add updater <br> 手動で追加する場合は、<u>Cargo.tomlファイル</u> ファイルに依存関係を記述する。<br> <br> <syntaxhighlight lang="toml"> # Cargo.toml [target."cfg(not(any(target_os = "android", target_os = "ios")))".dependencies] tauri-plugin-updater = "2.0.0" </syntaxhighlight> <br> ===== フロントエンド側のインストール ===== JavaScript / TypeScriptバインディングをインストールする。<br> <br> # pnpmを使用する場合 pnpm add @tauri-apps/plugin-updater @tauri-apps/plugin-process # npmを使用する場合 npm install @tauri-apps/plugin-updater @tauri-apps/plugin-process <br> <u>@tauri-apps/plugin-process</u> は、更新後のアプリケーション再起動に必要である。<br> <br> ==== Rust側の登録 ==== プラグインをTauriアプリケーションに登録する。<br> <br> <u>src-tauri/src/lib.rs</u> (または、<u>main.rs</u>) ファイルに以下に示す処理を追加する。<br> <br> <syntaxhighlight lang="rust"> // src-tauri/src/lib.rs #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() .setup(|app| { // デスクトップ環境でのみupdaterプラグインを有効化 #[cfg(desktop)] { app.handle().plugin(tauri_plugin_updater::Builder::new().build())?; } Ok(()) }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } </syntaxhighlight> <br> <code>#[cfg(desktop)]</code> 属性により、モバイルプラットフォームではupdaterが無効化される。<br> <br> ==== tauri.conf.jsonの設定 ==== <u>tauri.conf.json</u> ファイルでupdaterの設定を行う。<br> <br> <syntaxhighlight lang="json"> { "bundle": { "createUpdaterArtifacts": true }, "plugins": { "updater": { "pubkey": "CONTENT_FROM_PUBLICKEY_PEM", "endpoints": [ "https://releases.myapp.com/{{target}}/{{arch}}/{{current_version}}" ] } } } </syntaxhighlight> <br> 下表に、設定項目の詳細を示す。<br> <br> <center> {| class="wikitable" |+ tauri.conf.jsonファイルのupdater設定項目 ! 設定項目 !! 説明 |- | <code>createUpdaterArtifacts</code> || ビルド時に更新アーティファクト (署名付きパッケージ) を生成するかどうか<br><u>true</u> に設定する。 |- | <code>pubkey</code> || 公開鍵の内容 (ファイルパスではなく、鍵の内容を直接記述)<br>署名検証に使用する。 |- | <code>endpoints</code> || 更新チェック用のエンドポイントURL配列<br>複数指定した場合は順に試行される。 |- | <code>windows.installMode</code> || Windowsでのインストールモード<br><u>"passive"</u> (ユーザ操作なし) または <u>"basicUi"</u> (基本UI表示) |} </center> <br><br> == 署名鍵の生成と管理 == updaterプラグインは、更新パッケージの署名検証を行うことでセキュリティを確保する。<br> <br> ==== 鍵ペアの生成 ==== 署名鍵ペアを生成するには、Tauri CLIの <code>signer generate</code> コマンドを実行する。<br> <br> # 鍵ペアを生成 (対話的にパスワード入力を求められる) pnpm tauri signer generate -w ~/.tauri/myapp.key # または環境変数でパスワードを指定 TAURI_SIGNING_PRIVATE_KEY_PASSWORD=my_password pnpm tauri signer generate -w ~/.tauri/myapp.key <br> このコマンドにより、以下に示す2つのファイルが生成される。<br> <br> <center> {| class="wikitable" |+ 生成される鍵ファイル ! ファイル !! 説明 !! 取扱い |- | myapp.key || 秘密鍵 || 厳重に管理する。<br>バージョン管理システムにコミットしない。 |- | myapp.key.pub || 公開鍵 || <u>tauri.conf.json</u> ファイルの <code>pubkey</code> に設定する。 |} </center> <br> ==== 環境変数の設定 ==== ビルド時に署名を行うために、環境変数を設定する必要がある。<br> <br> # 秘密鍵の内容を環境変数に設定 (bash/zshの場合) export TAURI_SIGNING_PRIVATE_KEY=$(cat ~/.tauri/myapp.key) # パスワードも設定 export TAURI_SIGNING_PRIVATE_KEY_PASSWORD=my_password <br> CI/CD環境では、シークレットとして設定することを推奨する。<br> <br> <syntaxhighlight lang="yaml"> # GitHub Actionsの例 env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} </syntaxhighlight> <br> ==== 公開鍵の設定 ==== 生成された公開鍵の内容を <u>tauri.conf.json</u> ファイルに設定する。<br> <br> # 公開鍵の内容を確認 cat ~/.tauri/myapp.key.pub <br> 出力された内容を <code>pubkey</code> フィールドに貼り付ける。<br> <br> <syntaxhighlight lang="json"> { "plugins": { "updater": { "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkK..." } } } </syntaxhighlight> <br> ==== セキュリティ考慮事項 ==== 署名鍵の管理に関する重要な注意事項を以下に示す。<br> <br> * 秘密鍵は絶対に公開しない。 *: 秘密鍵が漏洩すると、攻撃者が偽の更新パッケージを作成できる。 *: バージョン管理システム (<u>.git</u> ディレクトリ等) に含めない。 * パスワードは強力なものを使用する。 *: 秘密鍵のパスワードは推測困難な文字列を設定する。 * CI/CDではシークレット機能を使用する。 *: GitHub Secrets、GitLab CI Variables等の暗号化されたシークレット機能を使用する。 * 本番環境ではHTTPSを使用する。 *: 更新エンドポイントは必ずHTTPSで配信する。 *: HTTPの場合は中間者攻撃のリスクがある。 <br><br> == アップデートサーバの設定 == updaterは、更新情報を提供するサーバ (エンドポイント) と通信して更新を確認する。<br> <br> ==== 静的JSONサーバ ==== 最も簡単な構成は、静的JSONファイルをWebサーバで配信する方法である。<br> <br> ===== JSON形式 ===== 更新情報のJSON形式を以下に示す。<br> <br> <syntaxhighlight lang="json"> { "version": "1.2.0", "notes": "バグ修正とパフォーマンス改善", "pub_date": "2025-01-15T10:30:00Z", "platforms": { "linux-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6...", "url": "https://releases.myapp.com/v1.2.0/myapp_1.2.0_amd64.AppImage" }, "windows-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6...", "url": "https://releases.myapp.com/v1.2.0/myapp_1.2.0_x64-setup.exe" }, "darwin-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6...", "url": "https://releases.myapp.com/v1.2.0/myapp_1.2.0_x64.dmg" }, "darwin-aarch64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6...", "url": "https://releases.myapp.com/v1.2.0/myapp_1.2.0_aarch64.dmg" } } } </syntaxhighlight> <br> 各フィールドの説明を以下に示す。<br> <br> <center> {| class="wikitable" |+ JSONフィールドの説明 ! フィールド !! 説明 !! 必須 |- | <code>version</code> || 最新バージョン番号 || Yes |- | <code>notes</code> || リリースノート (Markdown形式) || No |- | <code>pub_date</code> || 公開日時 (ISO 8601形式) || No |- | <code>platforms</code> || プラットフォーム別の更新情報 || Yes |- | <code>platforms.<プラットフォーム>.signature</code> || パッケージの署名 || Yes |- | <code>platforms.<プラットフォーム>.url</code> || パッケージのダウンロードURL || Yes |} </center> <br> ===== プラットフォーム識別子 ===== <code>platforms</code> オブジェクトのキーには、以下に示す形式を使用する。<br> <br> {target}-{arch} <br> <center> {| class="wikitable" |+ プラットフォーム識別子 ! target !! arch !! 説明 |- | <code>linux</code> || <code>x86_64</code>, <code>aarch64</code> || Linux |- | <code>windows</code> || <code>x86_64</code>, <code>i686</code> || Windows |- | <code>darwin</code> || <code>x86_64</code>, <code>aarch64</code> || MacOS |} </center> <br> ==== 動的エンドポイント ==== <u>tauri.conf.json</u> ファイルのエンドポイントURLには、動的変数を使用できる。<br> <br> <center> {| class="wikitable" |+ エンドポイント変数 ! 変数 !! 説明 !! 例 |- | <code><nowiki>{{current_version}}</nowiki></code> || 現在のアプリバージョン || 1.0.0 |- | <code><nowiki>{{target}}</nowiki></code> || OS名 || linux, windows, darwin |- | <code><nowiki>{{arch}}</nowiki></code> || アーキテクチャ || x86_64, aarch64, armv7 |} </center> <br> これらの変数を使用することにより、サーバ側でプラットフォームを判定できる。<br> <br> <syntaxhighlight lang="json"> { "endpoints": [ "https://api.myapp.com/update?version={{current_version}}&platform={{target}}&arch={{arch}}" ] } </syntaxhighlight> <br> ==== 動的サーバのレスポンス形式 ==== 動的サーバの場合、更新が存在する場合は <u>200 OK</u> でJSONを返し、更新がない場合は <u>204 No Content</u> を返す。<br> <br> 更新がある場合のレスポンス例を以下に示す。<br> <br> <syntaxhighlight lang="json"> { "version": "1.2.0", "pub_date": "2025-01-15T10:30:00Z", "url": "https://releases.myapp.com/v1.2.0/myapp_1.2.0_x64-setup.exe", "signature": "dW50cnVzdGVkIGNvbW1lbnQ6...", "notes": "## 新機能\n- 機能Aを追加\n- 機能Bを改善" } </syntaxhighlight> <br> ==== GitHub Releasesの活用 ==== GitHub Releasesを使用して更新パッケージを配信する場合の構成例を示す。<br> <br> <syntaxhighlight lang="json"> { "plugins": { "updater": { "pubkey": "YOUR_PUBLIC_KEY", "endpoints": [ "https://github.com/user/myapp/releases/latest/download/latest.json" ] } } } </syntaxhighlight> <br> GitHub Actionsでビルド時にJSONを生成する例を以下に示す。<br> <br> <syntaxhighlight lang="yaml"> # .github/workflows/release.yml - name: Generate update JSON run: | cat > latest.json << EOF { "version": "${{ env.VERSION }}", "platforms": { "linux-x86_64": { "signature": "$(cat myapp_${{ env.VERSION }}_amd64.AppImage.sig)", "url": "https://github.com/user/myapp/releases/download/v${{ env.VERSION }}/myapp_${{ env.VERSION }}_amd64.AppImage" } } } EOF </syntaxhighlight> <br><br> == React / TypeScriptでの実装 == フロントエンドで更新チェックとインストールを行う定義を示す。<br> <br> ==== 基本的な更新チェック ==== 最も簡単な更新チェックの例を以下に示す。<br> <br> <syntaxhighlight lang="typescript"> // src/hooks/useUpdateCheck.ts import { check } from '@tauri-apps/plugin-updater'; import { relaunch } from '@tauri-apps/plugin-process'; import { useState, useCallback } from 'react'; // 更新情報の型定義 interface UpdateInfo { version: string; currentVersion: string; date?: string; body?: string; } export function useUpdateCheck() { const [updateInfo, setUpdateInfo] = useState<UpdateInfo | null>(null); const [isChecking, setIsChecking] = useState(false); const [error, setError] = useState<string | null>(null); // 更新チェックを実行 const checkForUpdate = useCallback(async () => { setIsChecking(true); setError(null); try { const update = await check(); if (update) { // 更新が存在する場合 setUpdateInfo({ version: update.version, currentVersion: update.currentVersion, date: update.date, body: update.body, }); } else { // 更新がない場合 setUpdateInfo(null); } } catch (err) { // エラーハンドリング const message = err instanceof Error ? err.message : String(err); setError(message); } finally { setIsChecking(false); } }, []); return { updateInfo, isChecking, error, checkForUpdate }; } </syntaxhighlight> <br> ==== 進捗表示付きダウンロードとインストール ==== ダウンロード進捗を表示しながら更新をインストールする例を以下に示す。<br> <br> <syntaxhighlight lang="typescript"> // src/hooks/useUpdateInstall.ts import { check } from '@tauri-apps/plugin-updater'; import { relaunch } from '@tauri-apps/plugin-process'; import { useState, useCallback } from 'react'; // ダウンロード進捗の型 interface DownloadProgress { downloaded: number; total: number | null; percentage: number; } export function useUpdateInstall() { const [isInstalling, setIsInstalling] = useState(false); const [progress, setProgress] = useState<DownloadProgress | null>(null); const [error, setError] = useState<string | null>(null); // 更新をダウンロードしてインストール const downloadAndInstall = useCallback(async () => { setIsInstalling(true); setError(null); setProgress({ downloaded: 0, total: null, percentage: 0 }); try { const update = await check(); if (!update) { throw new Error('利用可能な更新がありません'); } // ダウンロードとインストールを実行 (進捗コールバック付き) await update.downloadAndInstall((event) => { switch (event.event) { case 'Started': // ダウンロード開始 setProgress({ downloaded: 0, total: event.data.contentLength, percentage: 0, }); break; case 'Progress': // ダウンロード進捗更新 setProgress((prev) => { if (!prev) return null; const downloaded = prev.downloaded + event.data.chunkLength; const percentage = prev.total ? Math.round((downloaded / prev.total) * 100) : 0; return { ...prev, downloaded, percentage }; }); break; case 'Finished': // ダウンロード完了 setProgress((prev) => prev ? { ...prev, percentage: 100 } : null); break; } }); // アプリケーションを再起動 await relaunch(); } catch (err) { const message = err instanceof Error ? err.message : String(err); setError(message); } finally { setIsInstalling(false); } }, []); return { isInstalling, progress, error, downloadAndInstall }; } </syntaxhighlight> <br> ==== 更新通知UIコンポーネント ==== 更新通知を表示するReactコンポーネントの例を以下に示す。<br> <br> <syntaxhighlight lang="typescript"> // src/components/UpdateNotification.tsx import { useState, useEffect } from 'react'; import { check } from '@tauri-apps/plugin-updater'; import { relaunch } from '@tauri-apps/plugin-process'; interface UpdateNotificationProps { autoCheck?: boolean; // 自動チェックを有効にするか checkInterval?: number; // チェック間隔 (ミリ秒) } export function UpdateNotification({ autoCheck = true, checkInterval = 3600000, // デフォルト: 1時間 }: UpdateNotificationProps) { const [update, setUpdate] = useState<Awaited<ReturnType<typeof check>>>(); const [downloading, setDownloading] = useState(false); const [progress, setProgress] = useState(0); const [dismissed, setDismissed] = useState(false); // 更新チェック関数 const checkUpdate = async () => { const result = await check(); setUpdate(result); }; // 初回チェックと定期チェック useEffect(() => { if (!autoCheck) return; // 初回チェック checkUpdate(); // 定期チェック const interval = setInterval(checkUpdate, checkInterval); return () => clearInterval(interval); }, [autoCheck, checkInterval]); // 更新をインストール const handleInstall = async () => { if (!update) return; setDownloading(true); try { await update.downloadAndInstall((event) => { if (event.event === 'Progress') { // 進捗を計算 (簡易版) setProgress((prev) => Math.min(prev + 10, 90)); } }); setProgress(100); await relaunch(); } catch (error) { console.error('更新のインストールに失敗しました:', error); setDownloading(false); } }; // 更新がない、または、却下された場合は表示しない if (!update || dismissed) return null; return ( <div className="update-notification"> <div className="update-content"> <h3>新しいバージョンが利用可能です</h3> <p> バージョン {update.version} がリリースされました (現在: {update.currentVersion}) </p> {update.body && ( <div className="release-notes"> <pre>{update.body}</pre> </div> )} </div> <div className="update-actions"> {downloading ? ( <div className="progress-bar"> <div className="progress-fill" style={{ width: `${progress}%` }} /> <span>{progress}%</span> </div> ) : ( <> <button className="btn-primary" onClick={handleInstall} > 今すぐ更新 </button> <button className="btn-secondary" onClick={() => setDismissed(true)} > 後で </button> </> )} </div> </div> ); } </syntaxhighlight> <br><br> == アップデートフローのカスタマイズ == updaterプラグインは、アプリケーションの要件に合わせて更新フローをカスタマイズできる。<br> <br> ==== 自動更新チェック ==== アプリケーション起動時に自動で更新をチェックする実装例を以下に示す。<br> <br> <syntaxhighlight lang="typescript"> // src/App.tsx import { useEffect, useRef } from 'react'; import { check } from '@tauri-apps/plugin-updater'; export function App() { const hasChecked = useRef(false); useEffect(() => { // 既にチェック済みの場合はスキップ if (hasChecked.current) return; hasChecked.current = true; // 起動時に更新チェック (バックグラウンド) check().then((update) => { if (update) { console.log(`更新があります: v${update.version}`); // 通知状態を更新する等の処理 } }).catch((error) => { // エラーは静かに処理 (ユーザ体験を損なわない) console.warn('更新チェックに失敗しました:', error); }); }, []); return ( <div> {/* アプリケーションコンテンツ */} </div> ); } </syntaxhighlight> <br> ==== 強制更新と任意更新 ==== セキュリティ修正等重要な更新の場合は、ユーザに更新を強制できる。<br> <br> <syntaxhighlight lang="typescript"> // src/utils/updateManager.ts import { check } from '@tauri-apps/plugin-updater'; import { relaunch } from '@tauri-apps/plugin-process'; // 更新の重要度レベル type UpdateSeverity = 'optional' | 'recommended' | 'critical'; interface UpdateResult { available: boolean; severity: UpdateSeverity; version?: string; install: () => Promise<void>; } // バージョン比較関数 function parseVersion(version: string): number[] { return version.split('.').map(Number); } function compareVersions(v1: string, v2: string): number { const parts1 = parseVersion(v1); const parts2 = parseVersion(v2); for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) { const p1 = parts1[i] || 0; const p2 = parts2[i] || 0; if (p1 > p2) return 1; if (p1 < p2) return -1; } return 0; } // 重要度を判定 (サーバ側で設定するか、バージョン差分で判定) function determineSeverity( currentVersion: string, newVersion: string ): UpdateSeverity { const current = parseVersion(currentVersion); const latest = parseVersion(newVersion); // メジャーバージョンが異なる場合は重要 if (latest[0] > current[0]) { return 'critical'; } // マイナーバージョンが異なる場合は推奨 if (latest[1] > current[1]) { return 'recommended'; } // パッチレベルは任意 return 'optional'; } // 更新チェック関数 export async function checkUpdateSeverity(): Promise<UpdateResult> { const update = await check(); if (!update) { return { available: false, severity: 'optional', install: async () => {}, }; } const severity = determineSeverity( update.currentVersion, update.version ); return { available: true, severity, version: update.version, install: async () => { await update.downloadAndInstall(); await relaunch(); }, }; } </syntaxhighlight> <br> ==== Rust側での更新処理 ==== Rustバックエンドで更新処理を行うことも可能である。<br> <br> <syntaxhighlight lang="rust"> // src-tauri/src/lib.rs use tauri_plugin_updater::UpdaterExt; #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() .setup(|app| { #[cfg(desktop)] { // updaterプラグインを登録 app.handle().plugin(tauri_plugin_updater::Builder::new().build())?; // バックグラウンドで更新チェック let handle = app.handle().clone(); tauri::async_runtime::spawn(async move { if let Err(e) = check_and_update(handle).await { eprintln!("更新チェックエラー: {}", e); } }); } Ok(()) }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } #[cfg(desktop)] async fn check_and_update(app: tauri::AppHandle) -> Result<(), Box<dyn std::error::Error>> { // 更新をチェック if let Some(update) = app.updater()?.check().await? { println!("更新が見つかりました: {}", update.version); let mut downloaded = 0; let content_length = update.content_length.unwrap_or(0); // ダウンロードとインストール update .download_and_install( |chunk_length, _| { downloaded += chunk_length; println!("ダウンロード中: {} / {} bytes", downloaded, content_length); }, || { println!("ダウンロード完了"); }, ) .await?; println!("更新完了。再起動します。"); app.restart(); } Ok(()) } </syntaxhighlight> <br><br> == トラブルシューティング == updaterプラグイン使用時によく発生する問題と解決方法を以下に示す。<br> <br> ==== 署名検証エラー ==== <u>Signature verification failed</u> エラーが発生する場合の確認事項を以下に示す。<br> <br> * 公開鍵が正しく設定されているか確認する。 *: <u>tauri.conf.json</u> ファイルの <code>pubkey</code> フィールドが、ビルド時に使用した秘密鍵と対になっているか確認する。 * 環境変数が正しく設定されているか確認する。 *: <code>TAURI_SIGNING_PRIVATE_KEY</code> に秘密鍵の内容が設定されているか確認する。 * JSONの署名が正しいか確認する。 *: サーバのJSONに含まれる <code>signature</code> が、ビルド時に生成された署名と一致するか確認する。 <br> ==== エンドポイント接続エラー ==== <u>Failed to fetch update</u> エラーが発生する場合の確認事項を以下に示す。<br> <br> * URLが正しいか確認する。 *: エンドポイントURLに誤字がないか、変数が正しく展開されているか確認する。 * CORS設定を確認する。 *: サーバがCORSヘッダーを返しているか確認する。 * HTTPSを使用しているか確認する。 *: 本番環境ではHTTPSが必須である。 *: 開発環境でHTTPを使用する場合は、<code>dangerousInsecureTransportProtocol</code> を設定する。 <br> <syntaxhighlight lang="json"> { "plugins": { "updater": { "dangerousInsecureTransportProtocol": true } } } </syntaxhighlight> <br> ==== 更新が検出されない ==== <code>check()</code> が <u>null</u> を返す場合の確認事項を以下に示す。<br> <br> * バージョン番号を確認する。 *: サーバのJSONの <code>version</code> が、現在のアプリバージョンより新しいか確認する。 * プラットフォーム情報を確認する。 *: JSONに現在のプラットフォーム (<code>linux-x86_64</code>等) のエントリが存在するか確認する。 * サーバが <u>204 No Content</u> を返していないか確認する。 *: 動的サーバの場合、更新がない時は <u>204</u> を返すのが正しい動作である。 <br> ==== デバッグ方法 ==== updaterのデバッグには、以下に示す方法を活用する。<br> <br> ===== ログ出力の有効化 ===== Rust側でログ出力を有効にする。<br> <br> <syntaxhighlight lang="rust"> // Cargo.tomlに追加 [dependencies] log = "0.4" env_logger = "0.10" // main.rs/lib.rsの先頭に追加 env_logger::init(); </syntaxhighlight> <br> 環境変数でログレベルを設定する。<br> <br> # Linux / MacOS RUST_LOG=debug pnpm tauri dev # Windows (PowerShell) $env:RUST_LOG="debug"; pnpm tauri dev <br> ===== ネットワークリクエストの確認 ===== Webブラウザの開発者ツール や <code>curl</code>コマンドでエンドポイントにアクセスして、レスポンスを確認する。<br> <br> # エンドポイントのレスポンスを確認 curl -v https://releases.myapp.com/latest.json <br> ===== 手動での更新チェック ===== webブラウザのコンソールまたは開発ツールで手動実行する。<br> <br> <syntaxhighlight lang="javascript"> // ブラウザコンソールで実行 import('@tauri-apps/plugin-updater').then(({ check }) => { check().then((update) => console.log(update)); }); </syntaxhighlight> <br><br> == 参考リンク == * [https://tauri.app/plugin/updater/ Tauri公式ドキュメント - Updater] * [https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/updater tauri-plugin-updater (GitHub)] * [https://tauri.app/reference/configuration/ Tauri設定リファレンス] <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Tauri,Updater,Auto Update,Desktop App,Rust,React,TypeScript,SUSE,Linux,Windows,MacOS |description={{PAGENAME}} - Tauriの自動アップデート機能の導入と設定ガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:Rust]]
Tauriの基礎 - 自動アップデート
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse