# バッチ設計書 45-Create-AppxBundle

## 概要

複数のAppX/MSIXファイルからAppXバンドル（.msixbundle）を作成するPowerShellスクリプトの設計書である。

### 本バッチの処理概要

本バッチは、指定されたディレクトリ内からプロジェクト名にマッチするAppX/MSIXファイルを検索し、バンドルコンテンツマッピングファイルを生成した上で、MakeAppx.exeのbundleコマンドを使用してMSIXバンドルを作成する。

**業務上の目的・背景**：Windows Terminalは複数のアーキテクチャ（x86、x64、ARM64等）向けにビルドされる。各アーキテクチャのAppXパッケージを1つのMSIXバンドルにまとめることで、Microsoft Storeへのアップロードやユーザーへの配布が簡素化される。バンドルにはアーキテクチャ別のパッケージが含まれ、インストール時にデバイスに適したパッケージが自動選択される。

**バッチの実行タイミング**：CI/CDパイプラインのパッケージング段階で実行される。各アーキテクチャのビルドが完了した後に実行される。

**主要な処理内容**：
1. MakeAppx.exeの存在確認
2. 入力ディレクトリから対象AppX/MSIXファイルの列挙
3. バンドルコンテンツマッピングファイル（[Files]セクション）の生成
4. MakeAppx.exe bundleコマンドの実行
5. MSIXバンドルファイルの生成

**前後の処理との関連**：前提として各アーキテクチャのAppXビルドが完了していること。後続処理としてNew-AppInstallerFromTemplateAndBundle.ps1（No.47）での.appinstallerファイル生成や、Test-WindowsTerminalPackage.ps1（No.48）でのパッケージ検証が行われる。

**影響範囲**：MSIXバンドルファイルが生成され、Microsoft Storeへのアップロードやリリース配布に使用される。

## バッチ種別

パッケージング（AppXバンドル作成）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（リリースビルド時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | CI/CDパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| MakeAppx.exeの存在 | Windows SDK内のMakeAppx.exeが利用可能であること |
| AppXファイルの存在 | InputPathにプロジェクト名を含むAppX/MSIXファイルが存在すること |
| Windows SDK | Windows 10 SDK（10.0.22621.0以上推奨）がインストールされていること |

### 実行可否判定

必須パラメータ（ProjectName、BundleVersion、InputPath、OutputPath）がすべて指定され、MakeAppx.exeが存在すること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| ProjectName | string | Yes | なし | 入力AppXファイルの検索に使用するプロジェクト名 |
| BundleVersion | version | Yes | なし | AppXバンドルのバージョン番号 |
| InputPath | string | Yes | なし | AppX/MSIXファイルを検索するルートディレクトリ |
| OutputPath | string | Yes | なし | 出力MSIXバンドルファイルのパス |
| MakeAppxPath | string | No | C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\MakeAppx.exe | MakeAppx.exeのパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| AppX/MSIXファイル | .appx / .msix | 各アーキテクチャのアプリケーションパッケージ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| OutputPathで指定されたファイル | .msixbundle | 複数アーキテクチャを含むMSIXバンドル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | OutputPathパラメータで指定 |
| 出力先 | OutputPathパラメータで指定 |
| 文字コード | N/A（バイナリ形式） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. MakeAppx.exeの存在確認
   └─ Get-Itemで確認、存在しない場合はエラー終了（Exit 1）
2. バンドルコンテンツマッピングの生成（Create-AppxBundleMapping関数）
   └─ 2a. "[Files]"ヘッダーの設定
   └─ 2b. InputPath配下を再帰検索し、ProjectNameを含む*.appx/*.msixファイルを列挙
   └─ 2c. 各ファイルについて"フルパス" "ファイル名"形式の行を生成
   └─ 2d. 一時ファイルにASCIIエンコーディングで出力
3. MakeAppx.exe bundleコマンドの実行
   └─ bundle /v /bv {BundleVersion} /f {マッピングファイル} /p {OutputPath}
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{MakeAppx.exe存在確認}
    B -->|存在しない| C[エラー終了]
    B -->|存在する| D[AppX/MSIXファイル検索]
    D --> E[マッピングファイル生成]
    E --> F[MakeAppx.exe bundle実行]
    F --> G[MSIXバンドル出力]
    G --> H[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチではデータベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| Exit 1 | MakeAppx未検出 | MakeAppxPathで指定されたパスにMakeAppx.exeが存在しない | Windows SDKをインストールするか、正しいパスを指定 |
| N/A | ファイル未検出 | InputPathにマッチするAppXファイルが存在しない | ビルド成果物の存在を確認 |
| N/A | bundleコマンド失敗 | MakeAppx.exe bundleの実行に失敗 | 入力ファイルの整合性を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（リトライ機構なし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

MakeAppx.exeのパスとバージョン、入力ファイルの存在と整合性を確認してから再実行する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | MakeAppx.exeのbundle完了時 |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数個のAppXファイル（アーキテクチャ数分） |
| 目標処理時間 | 数分以内 |
| メモリ使用量上限 | MakeAppx.exeの制約に依存 |

## 排他制御

同一出力ファイルに対して同時実行しないこと。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| MakeAppx出力 | bundle実行時 | /vオプションによる詳細出力 |
| エラーメッセージ | MakeAppx未検出時 | MakeAppx.exeのパスが見つからない旨のエラー |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド失敗 | N/A | CI/CDパイプライン |

## 備考

- MakeAppxPathのデフォルト値はWindows 10 SDK 10.0.22621.0のx86版を参照している。
- マッピングファイルはASCIIエンコーディングで出力される（MakeAppx.exeの要件）。
- 一時ファイルは`New-TemporaryFile`で生成されるが、明示的な削除処理はスクリプト内に含まれていない。
- `/v`オプションにより、MakeAppx.exeの詳細な出力が有効化される。
- ソースファイルパス: `build/scripts/Create-AppxBundle.ps1`
