# バッチ設計書 8-Compile

## 概要

本ドキュメントは、Avaloniaプロジェクトにおける Nukeビルドターゲット `Compile` のバッチ設計書です。

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

このNukeビルドターゲットは、Avaloniaソリューション全体をコンパイルするためのメインビルドターゲットです。Clean、CompileNative、InitDnxターゲットに依存しており、これらが完了した後にDotNetBuildを実行してマネージドコード全体をビルドします。

**業務上の目的・背景**：Avaloniaフレームワークは複数のプロジェクトから構成される大規模な.NETソリューションです。このターゲットは、すべてのプロジェクトを正しい順序でビルドし、開発者やCI/CDパイプラインが一貫したビルドプロセスを実行できるようにします。依存関係の解決、コンパイル、中間成果物の生成を統合的に管理します。

**バッチの実行タイミング**：明示的に `./build.sh Compile` として実行するか、他のターゲット（RunTests、Package等）の依存関係として自動的に実行されます。

**主要な処理内容**：
1. Cleanターゲットの実行（ビルドディレクトリのクリーンアップ）
2. CompileNativeターゲットの実行（macOS時のみ）
3. InitDnxターゲットの実行（Bunツールの初期化）
4. DotNetBuildによるソリューション全体のビルド

**前後の処理との関連**：このターゲットはClean、CompileNative、InitDnxに依存しています。また、RunCoreLibsTests、RunRenderTests、RunToolsTests、RunLeakTests、CreateIntermediateNugetPackagesなど多くのターゲットの依存関係として使用されます。

**影響範囲**：プロジェクト全体のbin/obj/ディレクトリ、中間ファイル、コンパイル成果物に影響します。

## バッチ種別

ビルドターゲット / コンパイル処理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行または依存ターゲット経由） |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動 / 依存ターゲットの実行時 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| .NET SDK | global.jsonで指定されたバージョン（10.0.101） |
| dirs.proj | プロジェクトルートに存在 |
| 依存ターゲット | Clean、CompileNative、InitDnxが実行可能 |

### 実行可否判定

- .NET SDKが正しくインストールされていること
- ソースコードがビルド可能な状態であること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| Configuration | string | No | Release | ビルド構成（Debug/Release） |
| PackageVersion | string | No | SharedVersion.propsの値 | NuGetパッケージバージョン |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| dirs.proj | MSBuild | ソリューション定義（MSBuildSolution） |
| BuildParameters | C#クラス | ビルド設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 各プロジェクトのbin/ | バイナリ | コンパイル済みアセンブリ |
| 各プロジェクトのobj/ | 中間ファイル | ビルド中間ファイル |
| コンソール | ログ | dotnet buildの実行ログ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 各プロジェクトのアセンブリ名 |
| 出力先 | bin/{Configuration}/{TargetFramework}/ |
| 形式 | .dll / .exe |

## 処理フロー

### 処理シーケンス

```
1. 依存ターゲット実行
   └─ Clean: ビルドディレクトリのクリーンアップ
   └─ CompileNative: ネイティブコードのビルド（macOSのみ）
   └─ InitDnx: Bunツールの初期化
2. ビルド設定の適用
   └─ ApplySettingでConfiguration、PackageVersion等を設定
3. DotNetBuild実行
   └─ dirs.projをビルド対象として指定
   └─ ソリューション全体をコンパイル
```

### フローチャート

```mermaid
flowchart TD
    A[Compileターゲット開始] --> B[Cleanターゲット実行]
    B --> C[CompileNativeターゲット実行]
    C --> D[InitDnxターゲット実行]
    D --> E[ビルド設定適用]
    E --> F[DotNetBuild実行]
    F --> G{ビルド成功?}
    G -->|Yes| H[ターゲット正常終了]
    G -->|No| I[ビルド失敗]
```

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

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

本バッチはデータベース操作を行いません。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | データベース操作なし |

### テーブル別操作詳細

データベース操作はありません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非ゼロ終了 | コンパイルエラー | C#コードのコンパイルに失敗 | エラーメッセージを確認しコードを修正 |
| 非ゼロ終了 | 依存関係エラー | NuGetパッケージの復元に失敗 | ネットワーク接続とパッケージソースを確認 |
| 非ゼロ終了 | SDK未検出 | .NET SDKが見つからない | build.shを使用するか、手動でSDKをインストール |

### リトライ仕様

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

### 障害時対応

1. dotnet buildのエラーメッセージを確認
2. 依存するNuGetパッケージの復元状態を確認
3. Cleanを実行してから再ビルド
4. .NET SDKのバージョンを確認

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | ソリューション内の全プロジェクト |
| 目標処理時間 | 5-15分（プロジェクト数とマシンスペックに依存） |
| メモリ使用量上限 | MSBuildプロセスに依存（数GB程度） |

## 排他制御

同一ディレクトリでの複数同時ビルドは推奨されません。ファイルロックの競合が発生する可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | DotNetBuild実行時 | コンパイル進捗（verbosity: minimal） |
| エラーログ | エラー発生時 | コンパイルエラーの詳細 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 非ゼロ | ビルド失敗として報告 |
| 処理時間 | CI/CDタイムアウト | Azure Pipelines通知 |

## 備考

- `DependsOn(Clean, CompileNative, InitDnx)` により、3つの依存ターゲットが先に実行されます
- `SetProjectFile(Parameters.MSBuildSolution)` で dirs.proj を指定しています
- ApplySettingメソッドでPackageVersion、Configuration、Verbosityが設定されます
- Azure Pipelines環境では、JavaSdkDirectoryプロパティも追加で設定されます
- LocalBuildの場合は一部のプロパティ（ForcePackAvaloniaNative等）が追加されます
- DotNetVerbosity.minimalにより、ビルドログが簡潔化されています
