# バッチ設計書 41-GenerateAppxFromManifest.ps1

## 概要

本ドキュメントは、SxSマニフェストからアクティベータブルクラス情報を抽出し、AppxManifest.xmlにExtensions要素として追加するPowerShellスクリプト「GenerateAppxFromManifest.ps1」のバッチ設計書である。

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

SxS（Side-by-Side）マニフェストファイルに定義されたアクティベータブルクラスを読み取り、AppxManifest.xmlプロトタイプにInProcessServer拡張として追加する。UWP/WinRT AppXパッケージのマニフェスト生成を自動化するためのコード生成バッチである。

**業務上の目的・背景**：Windows Terminalプロジェクトでは、複数のWinRTコンポーネント（DLL）がInProcessServerとしてアクティベータブルクラスを公開している。SxSマニフェストに定義されたクラス情報をAppxManifest.xmlに手動で転記するのはミスが発生しやすく、コンポーネント追加・変更のたびにメンテナンスが必要となる。本バッチはこの転記作業を自動化し、ビルドプロセスの一部としてAppxManifest.xmlを正確に生成することで、パッケージングの信頼性を向上させる。

**バッチの実行タイミング**：ビルドプロセスの一部として、AppXパッケージ生成前に実行される。SxSマニフェストまたはAppxManifestプロトタイプに変更があった場合に随時実行される。

**主要な処理内容**：
1. SxSマニフェストXMLファイルを読み込み、assemblyノード配下のfile要素を列挙する
2. AppxManifestプロトタイプXMLファイルを読み込む
3. 各file要素に対して、windows.activatableClass.inProcessServerカテゴリのExtension要素を生成する
4. file要素内のactivatableClass子要素からActivatableClassId及びThreadingModelを取得し、ActivatableClass要素として追加する
5. 生成したExtensions要素をPackageノードに追加する
6. 更新されたXMLを指定出力パスに保存する

**前後の処理との関連**：ビルドプロセスにおいて、SxSマニフェストはコンパイル時に生成される。本バッチの出力であるAppxManifest.xmlは、後続のAppXパッケージング（Create-AppxBundle.ps1等）で使用される。

**影響範囲**：AppXパッケージのマニフェストファイルに影響を与える。マニフェストの不備はアプリケーションの起動やWinRTクラスのアクティベーションに直接影響する。

## バッチ種別

コード生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（ビルド時） |
| 実行時刻 | ビルドプロセス依存 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | ビルドプロセス／手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SxSマニフェストファイルの存在 | 入力パスに有効なSxSマニフェストXMLが存在すること |
| AppxManifestプロトタイプの存在 | 入力パスに有効なAppxManifest.xml形式のXMLが存在すること |
| PowerShell実行環境 | PowerShellが利用可能であること |

### 実行可否判定

3つの必須パラメータ（SxSManifest、AppxManifestPrototype、OutPath）がすべて指定されていること。パラメータが不足している場合はPowerShellの必須パラメータ検証によりエラーとなる。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| SxSManifest | string | Yes | なし | SxSマニフェストファイルのパス。アクティベータブルクラスの情報源 |
| AppxManifestPrototype | string | Yes | なし | AppxManifest.xmlスタイルのXMLドキュメントのパス。Extensions追加先のプロトタイプ |
| OutPath | string | Yes | なし | 更新されたXMLドキュメントの出力先パス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| SxSマニフェスト | XML | assembly/file/activatableClass構造を持つSide-by-Sideマニフェスト |
| AppxManifestプロトタイプ | XML | Package要素をルートに持つAppxManifest.xml形式のテンプレート |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| OutPathで指定されたファイル | XML | Extensions要素が追加されたAppxManifest.xml |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | OutPathパラメータで指定（通常AppxManifest.xml） |
| 出力先 | OutPathパラメータで指定 |
| 文字コード | UTF-8（XML標準） |
| 区切り文字 | 該当なし（XML形式） |

## 処理フロー

### 処理シーケンス

```
1. SxSマニフェストXML読み込み
   └─ Get-Content $SxSManifest で読み込み、[xml]にキャスト
2. AppxManifestプロトタイプXML読み込み
   └─ Get-Content $AppxManifestPrototype で読み込み、[xml]にキャスト
3. 名前空間の取得
   └─ Package要素のNamespaceURIを取得（xmlns=""問題の回避）
4. Extensions要素の作成
   └─ rootNSに属するExtensions要素を新規作成
5. SxSマニフェストのfile要素を列挙
   └─ assembly.fileを取得してForEach-Objectで処理
6. 各file要素に対してExtension/InProcessServer/Path要素を生成
   └─ Category="windows.activatableClass.inProcessServer"を設定
   └─ Path要素にDLL名（file.name）を設定
7. 各activatableClassに対してActivatableClass要素を生成
   └─ ActivatableClassId属性にclass.nameを設定
   └─ ThreadingModel属性にclass.threadingModelを設定
8. Extensions要素をPackageノードに追加
   └─ $appxPrototypeData.Package.AppendChild($Extensions)
9. 更新XMLの保存
   └─ $appxPrototypeData.save($OutPath)
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[SxSマニフェストXML読み込み]
    B --> C[AppxManifestプロトタイプXML読み込み]
    C --> D[Package名前空間URI取得]
    D --> E[Extensions要素作成]
    E --> F{file要素あり?}
    F -->|あり| G[Extension/InProcessServer/Path要素生成]
    G --> H{activatableClassあり?}
    H -->|あり| I[ActivatableClass要素生成・追加]
    I --> H
    H -->|なし| J[Extension要素をExtensionsに追加]
    J --> F
    F -->|なし| K[ExtensionsをPackageに追加]
    K --> L[XML保存]
    L --> M[バッチ終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | パラメータ不足 | 必須パラメータが未指定 | 3つの必須パラメータをすべて指定する |
| N/A | ファイル読み込みエラー | 入力ファイルが存在しないまたは読み取り不可 | ファイルパスと権限を確認する |
| N/A | XML解析エラー | 入力ファイルが不正なXML形式 | 入力ファイルのXML構造を確認する |
| N/A | ファイル書き込みエラー | 出力先パスへの書き込み権限がない | 出力先ディレクトリの権限を確認する |

### リトライ仕様

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

### 障害時対応

ビルドプロセスの一部として実行されるため、エラー発生時はビルドが失敗する。入力ファイルの整合性を確認し、再度ビルドを実行する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（ファイル操作のみ） |
| コミットタイミング | XML保存時に一括書き込み |
| ロールバック条件 | 該当なし（保存前にエラーが発生した場合、出力ファイルは生成されない） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | SxSマニフェスト内のfile要素数（通常数個〜十数個） |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制限なし（小規模XML処理） |

## 排他制御

同一出力ファイルへの同時書き込みは想定されていない。ビルドプロセスにより順序が制御される。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | 特になし | スクリプトは通常時にコンソール出力を抑制している（Out-Null使用） |
| デバッグ出力 | コメントアウトされたデバッグコード有効化時 | 生成されたXML文字列 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルドエラー | 発生時 | ビルドシステム（CI/CD） |

## 備考

- スクリプト内のコメントに記載されている通り、各要素をrootNS（Package要素の名前空間）で作成することが重要。これを行わないと`xmlns=""`属性が付与され、AppXデプロイメントがマニフェストを拒否する。
- `$placeholder = $Path.InnerText = $_.name`の記法は、InnerText設定の戻り値がコンソールにエコーされるのを防ぐためのパターンである。
- デバッグ用のXML出力コードがコメントアウトされた状態でスクリプト末尾に残されている。
- ソースファイルパス: `tools/GenerateAppxFromManifest.ps1`
