# バッチ設計書 30-start-vs-FsharpSln.cmd

## 概要

本ドキュメントは、F#コンパイラプロジェクトにおいてVisual StudioでFSharp.slnソリューションを開くためのバッチスクリプト（start-vs-FsharpSln.cmd）の設計を記述するものです。

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

このバッチはローカル版の.NET Core SDKを使用する環境変数を設定し、restore.cmdを実行した後、Visual StudioでFSharp.slnソリューションを開きます。F#コンパイラ開発に必要な環境設定を自動化します。

**業務上の目的・背景**：F#コンパイラの開発では、ローカルにインストールされた.NET SDKではなく、プロジェクト固有の.NET SDKバージョンを使用する必要があります。このスクリプトは、DOTNET_ROOT環境変数を設定してローカルのdotnet.exeを優先的に使用するようにし、開発者がVisual StudioでF#コンパイラプロジェクトをスムーズに開けるようにします。また、一部のAPI互換性タスクを無効化することで、VS起動時のエラーを防ぎます。

**バッチの実行タイミング**：開発者がF#コンパイラプロジェクトをVisual Studioで開発する際に手動で実行します。通常は開発セッションの開始時に1回実行します。

**主要な処理内容**：
1. DOTNET_ROOT環境変数を.dotnetディレクトリに設定
2. PATHにローカルのdotnet.exeを追加
3. restore.cmdを呼び出して依存関係をリストア
4. API互換性チェックタスクを無効化（RunNetFrameworkApiCompat、RunRefApiCompat）
5. Visual Studioの検出（開発者コマンドプロンプト、PATH、ファイル関連付け）
6. devenv.exeでFSharp.slnを開く

**前後の処理との関連**：restore.cmdを内部で呼び出します。.dotnetディレクトリ配下に.NET SDKがインストールされている必要があります。

**影響範囲**：環境変数（DOTNET_ROOT、PATH、RunNetFrameworkApiCompat、RunRefApiCompat）を一時的に変更します。プロセス終了後は元に戻ります。

## バッチ種別

開発環境起動 / IDE起動

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動実行） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行（開発者による） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| .dotnetディレクトリの存在 | ローカル.NET SDKがインストールされていること |
| Visual Studioのインストール | devenv.exeが利用可能であること |
| Windows環境 | Visual StudioのためWindows必須 |

### 実行可否判定

.dotnet\dotnet.exeが存在しない場合、エラーメッセージを表示してrestore.cmdの実行を促し、終了コード1で終了します。

## 入力仕様

### 入力パラメータ

このスクリプトは入力パラメータを受け付けません。

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| N/A | N/A | N/A | N/A | パラメータなし |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| .dotnet\dotnet.exe | 実行ファイル | ローカル.NET SDK |
| FSharp.sln | Visual Studioソリューション | F#コンパイラのメインソリューション |
| restore.cmd | バッチファイル | 依存関係リストアスクリプト |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Visual Studio | プロセス | FSharp.slnを開いた状態でVSを起動 |
| 標準出力 | テキスト | エラーメッセージ（必要時） |
| 終了コード | 整数 | 0:成功、1:失敗 |

### 出力ファイル仕様

このスクリプトはファイル出力を行いません。

| 項目 | 内容 |
|-----|------|
| ファイル名 | N/A |
| 出力先 | N/A |
| 文字コード | N/A |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. 環境変数設定
   └─ DOTNET_ROOT、DOTNET_ROOT(x86)を.dotnetディレクトリに設定
2. PATH更新
   └─ DOTNET_ROOTをPATHの先頭に追加
3. restore.cmd実行
   └─ 依存関係のリストア
4. dotnet.exe存在チェック
   └─ 存在しない場合はエラー終了
5. API互換性タスク無効化
   └─ RunNetFrameworkApiCompat=false、RunRefApiCompat=false
6. Visual Studio検出
   └─ 6.1. DevEnvDir環境変数（開発者コマンドプロンプト）をチェック
   └─ 6.2. where devenv.exeでPATH上を検索
   └─ 6.3. ファイル関連付けにフォールバック
7. Visual Studio起動
   └─ devenv.exeまたはstart /BでFSharp.slnを開く
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[DOTNET_ROOT設定]
    B --> C[PATH更新]
    C --> D[restore.cmd実行]
    D --> E{dotnet.exe存在?}
    E -->|いいえ| F[エラーメッセージ・exit /b 1]
    E -->|はい| G[API互換性タスク無効化]
    G --> H{DevEnvDir設定済み?}
    H -->|はい| I[DevEnvDirのdevenv.exe使用]
    H -->|いいえ| J{devenv.exe in PATH?}
    J -->|はい| K[PATHのdevenv.exe使用]
    J -->|いいえ| L[start /B .\FSharp.sln]
    I --> M[VS起動・FSharp.sln開く]
    K --> M
    L --> M
    M --> N[バッチ終了]
```

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

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

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

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | dotnet.exe不在 | .NET SDKがインストールされていない | restore.cmdを実行 |
| N/A | VS起動失敗 | Visual Studioがインストールされていない | Visual Studioをインストール |

### リトライ仕様

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

### 障害時対応

1. restore.cmdを手動で実行
2. .dotnet\dotnet.exeの存在を確認
3. Visual Studioのインストール状態を確認

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1プロセス（VS起動） |
| 目標処理時間 | restore完了後数秒 |
| メモリ使用量上限 | N/A（VS依存） |

## 排他制御

複数インスタンスの実行は可能ですが、同じソリューションを複数のVSインスタンスで開くことは推奨されません。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | dotnet.exe不在時 | "[ERROR] .NET Core has not yet been installed..." |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 1 | 手動確認（開発者） |

## 備考

- EnableDelayedExpansionを使用して遅延展開を有効化しています
- start /Bオプションでバックグラウンドでプロセスを起動します
- DevEnvDir環境変数は開発者コマンドプロンプトで設定されます
- RunNetFrameworkApiCompatとRunRefApiCompatを無効化することで、VS起動時のタスクエラーを防ぎます
- ファイル関連付けにフォールバックする場合、.slnファイルに関連付けられたデフォルトアプリケーションで開きます
- Visual StudioのCOMSPECを介した起動方法を使用しており、引用符の扱いに注意が必要です
