トラブルシューティング
開発、パッケージング、署名、起動、更新に関する問題を切り分けます。
まず、レンダラー、Node Main、ネイティブホストのどこで失敗しているかを切り分けます。murasaki dev で再現を確認した後、実際の配布物をビルドして起動してください。Vite のビルドが成功しても、パッケージング、コード署名、実行時に見つけるリソース、別のマシンの信頼設定まで正しく動作するとは限りません。
開発ウィンドウが開かない
ターミナルから実行し、スタックトレースの最終行ではなく、最初のエラーを確認します。
pnpm exec murasaki devMurasaki は config.devPort(デフォルト 5178)を確認し、使用中なら次のポートへ進みます。それでも待ち続ける、または終了する場合は、次を確認してください。
node --versionで Node.js 22.12 以上であることを確認するmurasaki.config.tsがappIdとproductNameを含むオブジェクトをエクスポートしているか確認するsrc/main.tsの名前を一時的に変えるか、main: falseを指定して Node Main の起動処理を切り分ける- 選択されたポートを使用している古い開発プロセスを終了する
- 現在の OS とアーキテクチャ向けに依存パッケージを入れ直す
main.ready() が完了するまで、レンダラーは意図的に開きません。ネットワーク初期化にはタイムアウトを設け、起動時に確保する各リソースの前後でログを記録してください。
HMR は動くが Main の変更で再起動しない
設定した Node Main のエントリーファイルを変更すると、ライフサイクルが再読み込みされます。リソースの所有処理をエントリーへ集め、shutdown() は複数回呼ばれても安全な実装にしてください。深くインポートしたヘルパーだけを変更して再起動が必要な場合は、エントリーファイルも保存してください。モジュール直下で作成したソケット、タイマー、子プロセスは、ライフサイクル内で作成・終了しないと残ってしまう場合があります。
開発時は動作するがバンドル後に動作しない
インストーラーを作る前に、アプリバンドルをテストします。
pnpm exec murasaki bundle
open "dist/bundle/My App.app" # macOS
# または: dist\\bundle\\My App\\My App.exe # Windows主な原因:
- Node の依存パッケージが、バンドラーが検出できないファイルを動的に読み込んでいる
- ネイティブアドオンに対象アーキテクチャ向けのバイナリが含まれていない
- コードが
MainContext.paths.dataではなく実行ファイルの隣に書き込んでいる - コードが
process.cwd()をプロジェクトルートだと仮定している - 開発時にはあったシークレットや
.envファイルが、インストール後のアプリには配置されていない
リソースのパスを明示し、クリーンな仮想マシンまたはユーザーアカウントでテストしてください。現在の Node.js 依存パッケージの同梱処理は、あらゆるネイティブアドオンや実行時リソースの配置において Electron Forge や Tauri のバンドラーと同等というわけではありません。
macOS で「壊れている」「検証できない」と表示される
まず、成果物を分類します。
codesign -dvvv --entitlements :- "dist/bundle/My App.app"
codesign --verify --deep --strict --verbose=2 "dist/bundle/My App.app"
spctl -a -vv "dist/bundle/My App.app"
xattr -l "dist/bundle/My App.app"--signを指定しないmurasaki bundleは ad-hoc 署名 を作成します。ローカルでのバンドルの整合性は確認できますが、信頼できる開発者であることは証明されませんmurasaki bundle --signは Developer ID と hardened runtime を使用しますmurasaki installer --sign --notarizeは、さらに Gatekeeper 向けに DMG を提出してステープルまで行います
自分の開発用 / テスト用の成果物に限り、隔離属性を外して再試行できます。
xattr -dr com.apple.quarantine "dist/bundle/My App.app"これを一般公開のインストール手順として案内しないでください。警告なしで macOS に一般公開するには Developer ID と公証が必要であり、ad-hoc 署名では代替できません。
macOS でアーキテクチャが一致しない
ランチャーと同梱された Node を確認します。
file "dist/bundle/My App.app/Contents/MacOS/My App"
file "dist/bundle/My App.app/Contents/Resources/node/bin/node"Apple Silicon 向けには --arch arm64、Intel 向けには --arch x64 でリビルドします。アプリ内のすべてのネイティブアドオンも、対象のアーキテクチャに合わせる必要があります。クロスアーキテクチャでのパッケージングは、サードパーティ製のネイティブモジュールを自動的に変換するものではありません。
Windows のインストーラーが生成されない
バンドルが成功すれば、murasaki bundle --target win32-x64 は常にポータブルディレクトリと .zip を生成します。インストーラー形式の生成には外部ツールが必要です。
.exe: NSIS(makensis)。macOS / Windows でコンパイル可能です.msi: WiX v4。Windows 上で実行します
どちらも PATH にない場合、murasaki installer はインストーラーが生成されなかったと報告します。ポータブル ZIP を使うか、必要なツールをインストールしてください。--sign には Windows SDK の SignTool も必要で、Windows 上で実行する必要があります。署名に失敗する場合は、PFX / store / Artifact Signing のいずれか1つの署名ソースだけが選択されていること、タイムスタンプサービスに接続できること、signtool verify /pa /v /tw <artifact> が成功することを確認してください。
シャットダウンが止まる、または途中で打ち切られる
shutdown() のデフォルトのタイムアウトは 10 秒です。新規リクエストの受付を停止し、context.signal で保留中のリクエストを中断してから、キューの完了を待つ前にサーバーをクローズします。計測に基づく明確な要件がある場合のみ、上限を増やしてください。
main: { shutdownTimeoutMs: 20_000 }shutdown() の中で無制限にリトライしないでください。強制終了する場合、beforeQuit() によるキャンセルは無視されます。
Backend call が 403
/api/* と /__murasaki/* は、アプリ内部に閉じた保護対象のエンドポイントです。通常のブラウザタブや curl コマンド、外部クライアントはネイティブウィンドウが持つ HMAC 由来の識別情報を持たないため、403 が返るのは正しい挙動です。API Routes は、backendCapabilities でその正確なリソースへのアクセスを許可されたアプリのレンダラーから呼び出してください。公開用またはローカル用の連携サーバーが必要な場合は、Node Main 内に別のリスナーを作成し、独自に保護してください。
アプリのレンダラー自体が 403 になる場合は、backendCapabilities を確認し、相対 URL を使用し、ネイティブの document-start スクリプトが提供する fetch / XHR / EventSource のラッパーを置き換えないようにしてください。Host ヘッダーと Origin ヘッダーが、アプリケーションのオリジンのままであることも確認してください。
アップデートの確認が失敗する
次の順で確認します。
latest.jsonとlatest.json.sigが隣接する URL に置かれているか- 埋め込まれた
publicKeyが CI で使われている秘密鍵と対になっているか - マニフェストの署名が、アップロード済み JSON の正確なバイト列を対象にしているか
- 現在の
<platform>-<arch>に対応するアセットキーが存在するか - ペイロード URL に到達でき、SHA-256 が一致するか
- ダウンロードとインストールを、開発時ではなくバンドルから実行しているか
リリースを診断するために署名検証を無効化しないでください。代わりに、テスト用の鍵ペアとマニフェストを新しく作成してください。自動更新も参照してください。
解決しない場合
Murasaki のバージョン、OS のバージョン、アーキテクチャ、実行した正確なコマンド、最初に出たエラー、そして最小限の再現手順を添えてください。通常のバグは公開の GitHub Issue、脆弱性は非公開の Security Advisoryを使用してください。