コンテンツにスキップ
Documents for MorningStatusApp
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

デスクトップアプリのビルド手順

概要

MorningStatusApp デスクトップアプリ(Electrobun)のビルドとインストーラ・DMG 作成手順。

インストーラ/アプリバンドルには Next.js standalone サーバーが同梱されており、アプリ起動時に自動的にサーバーが立ち上がります。

前提条件

Windows

  • .env.local(プロジェクトルート)が存在すること(接続先 Blob URL・API キーを含む)
  • 初回ビルド時、Hutch(Electrobun 2.0.1 のビルドツールチェーン)が ~/.hutch へツールチェーンをネットワーク経由で自動ダウンロードする

Electrobun 2.0.1(Hutch)移行前は Inno Setup 7 が必要だったが、Hutch 純正インストーラへの移行(#1548)により不要になった。

macOS

  • Bun がインストール済であること(curl -fsSL https://bun.sh/install | bash)
  • .env.local(プロジェクトルート)が存在すること(接続先 Blob URL・API キーを含む)

Windows ビルド手順(推奨:一括ビルド)

build-installer.ps1 が以下をすべて自動実行します:

  1. DESKTOP_MODE=1 で Next.js standalone ビルド
  2. Electrobun アプリ・インストーラビルド(electrobun build --env=stable。Next.js standalone サーバーの同梱、アイコン埋め込み、インストーラ生成までHutchが一括で行う)
pwsh -File setup/build-installer.ps1

備考(バグとして顕在化した問題と対策、#1599): build-installer.ps1は冒頭でSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Processを実行する。Hutchはインストーラ生成の最終段階(配布用zip作成)で内部的にpowershell.exe -Command "Compress-Archive ..."を子プロセスとして起動するが、実行元シェルの実行ポリシー設定によってはこの呼び出しがReleaseCommandFailedで失敗していた(MorningStatusApp-Setup.exe本体の生成自体には影響しない)。プロセススコープでの上書きのため管理者権限は不要で、スクリプト実行後に元の設定へ影響を残さない。

成果物: desktop/build/stable-win-x64/MorningStatusApp-Setup.exe

macOS ビルド手順(推奨:一括ビルド)

build-macos.sh が以下をすべて自動実行します:

  1. DESKTOP_MODE=1 で Next.js standalone ビルド
  2. Electrobun アプリ・インストーラ(DMG)ビルド(electrobun build --env=stable。Next.js standalone サーバーの同梱まで一括で行う)
bash setup/build-macos.sh

成果物:

  • .app バンドル: desktop/build/stable-macos-arm64/MorningStatusApp.app(Apple Silicon)
  • DMG: desktop/artifacts/(Electrobun が自動生成する場合)

注意: macOS ビルドは macOS 環境で実行すること。Electrobun 2.0.1(Hutch)移行後の手順はApple Silicon実機(v9.25.0)でビルド〜インストール〜起動まで検証済。

ビルド手順(ステップ別)

1. Next.js standalone ビルド

DESKTOP_MODE=1 bun run next build

DESKTOP_MODE=1 を指定すると next.config.ts が output: 'standalone' を有効化し、 .next/standalone/ に自己完結型サーバーが生成されます。

2. Electrobun アプリ・インストーラのビルド

--env=stable を指定すると、Hutch が build.scripts.preBuild フック経由で Next.js standalone サーバーの同梱(build.copy。デスクトップアプリ(Electrobun)設計書 §2.1 参照)からインストーラ生成までを一括で行う。

cd desktop
bunx electrobun build --env=stable

成果物:

  • Windows: desktop/build/stable-win-x64/MorningStatusApp/、インストーラ desktop/build/stable-win-x64/MorningStatusApp-Setup.exe
  • macOS(Apple Silicon): desktop/build/stable-macos-arm64/MorningStatusApp.app/

--env=stable を省略すると dev チャンネル(desktop/build/dev-win-x64/ 等)になり、開発中の動作確認用ビルドとして扱われる。配布用インストーラには必ず --env=stable を指定すること。

UI言語(Windows): v1(Inno Setup、日本語UI)と異なり、Hutch純正インストーラのUIは英語表示のみ(日本語ローカライズ手段が現時点でHutchに用意されていない)。

3. インストール

Windows: 生成した MorningStatusApp-Setup.exe を実行する。

  • インストール先: %LOCALAPPDATA%\Programs\MorningStatusApp(実機確認済。管理者権限なしでインストールされる)
  • 実行時展開先: %LOCALAPPDATA%\{app.identifier}\stable\app\(デスクトップアプリ(Electrobun)設計書 §3.1 参照)。launcher.exe が初回起動時に自己展開する
  • スタートメニュー: MorningStatusApp グループが作成される
  • アンインストール: コントロールパネル/設定からアンインストール可能

macOS: MorningStatusApp.app を /Applications にコピーして起動する。

アプリを改修した場合のフロー

1. package.json のバージョンを更新する(必要な場合)
2. (Windows)pwsh -File setup/build-installer.ps1
   (macOS)  bash setup/build-macos.sh

起動フロー・プロセス終了時のクリーンアップ・WebViewのキャッシュ制御など、アプリ実行時のアーキテクチャは デスクトップアプリ(Electrobun)設計書 を参照。

インストーラに含まれるファイル

配置先 内容
{app}/bin/ Electrobun バイナリ(bun.exe, launcher.exe 等)
{app}/Resources/app/bun/ Electrobun ワーカー (index.js)
{app}/Resources/app/nextjs/standalone/ Next.js standalone サーバー
{app}/Resources/app/nextjs/standalone/.next/static/ 静的アセット
{app}/Resources/app/nextjs/standalone/public/ public ディレクトリ
{app}/Resources/app/nextjs/standalone/.env.local 接続設定(Blob URL・API キー)

{app} は実行時展開先(Windows: %LOCALAPPDATA%\{app.identifier}\stable\app\)を指す。インストール先そのもの(%LOCALAPPDATA%\Programs\MorningStatusApp\)には bin/launcher.exe と圧縮パッケージ(Resources/*.tar.zst)のみが置かれ、上記の構成は含まれない(デスクトップアプリ(Electrobun)設計書 §3.1 参照)。

3箇所に分かれたバージョン管理・アイコン素材の詳細は デスクトップアプリ(Electrobun)設計書 を参照。

注意事項

  • desktop/build/ / desktop/artifacts/ / desktop/.hutch/ / desktop/.next-standalone-staging/ はリポジトリから除外(.gitignore 設定済)
  • .env.local(プロジェクトルート)には API キー等が含まれるため、インストーラに同梱されるファイルを公開しないこと

このページは役に立ちましたか?