# バッチ設計書 19-dotnet.sh

## 概要

本ドキュメントは、dotnetコマンドラッパースクリプト（eng/common/dotnet.sh）の設計仕様を記述したものである。

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

dotnet.shは、Linux/macOS環境で.NET SDKをインストールし、dotnetコマンドを実行するためのラッパースクリプトである。このスクリプトはtools.shの共通関数を利用し、必要に応じてSDKのインストールを行った後、指定された引数でdotnetコマンドを実行する。

**業務上の目的・背景**：クロスプラットフォーム開発において、Linux/macOS環境でもリポジトリ固有のSDKバージョンを使用することが重要である。dotnet.shは、システムにインストールされたdotnetではなく、リポジトリローカルの.dotnet/ディレクトリにインストールされた正しいバージョンのSDKを使用してdotnetコマンドを実行することを保証する。

**バッチの実行タイミング**：開発者による手動実行（随時）。dotnet CLIコマンドを実行する際に、リポジトリ固有のバージョンを使用したい場合に使用。

**主要な処理内容**：
1. シンボリックリンクの解決とスクリプトルートの特定
2. tools.shの読み込み
3. InitializeDotNetCli関数の呼び出し（install: true）
4. 引数が指定された場合はdotnetコマンドを実行
5. 実行結果の返却

**前後の処理との関連**：単独で使用可能。開発者が直接dotnetコマンドを実行したい場合のエントリポイントとして機能。

**影響範囲**：.dotnet/ディレクトリのSDK、コマンド実行結果。

## バッチ種別

共通 / dotnetコマンドラッパー

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 指定なし |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Linux/macOS | Unix系OS環境 |
| Bash | Bash 4.0以上推奨 |
| curl または wget | SDK未インストール時に必要 |

### 実行可否判定

特段の実行可否判定は行わない。引数が指定された場合はdotnetコマンドとして実行される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $@ | string | No | なし | dotnetコマンドに渡す引数 |

### 使用例

```bash
./dotnet.sh build
./dotnet.sh test
./dotnet.sh restore
./dotnet.sh run --project MyApp
```

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| コマンドライン引数 | パラメータ | dotnetコマンドの引数 |
| global.json | JSON | SDKバージョン情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | dotnetコマンドの出力 |
| .dotnet/ | ディレクトリ | インストールされたSDK（初回時） |

### 出力ファイル仕様

dotnetコマンドの実行内容に依存。

## 処理フロー

### 処理シーケンス

```
1. スクリプト起動
   └─ #!/usr/bin/env bash
2. シンボリックリンク解決
   └─ while [[ -h $source ]] ループ
3. scriptroot確定
   └─ cd -P でディレクトリパス取得
4. tools.sh読み込み
   └─ source $scriptroot/tools.sh
5. InitializeDotNetCli呼び出し
   └─ true を渡してインストールモード
6. 引数チェック
   └─ [[ $# > 0 ]] で引数存在確認
7. dotnetコマンド実行（引数あり時）
   ├─ dotnetディレクトリからパス取得
   └─ ${dotnetPath} "$@" で実行
```

### フローチャート

```mermaid
flowchart TD
    A[dotnet.sh開始] --> B[シンボリックリンク解決]
    B --> C[scriptroot確定]
    C --> D[tools.sh読み込み]
    D --> E[InitializeDotNetCli true]
    E --> F{引数あり?}
    F -->|Yes| G[dotnetディレクトリ取得]
    G --> H[dotnetコマンド実行]
    H --> I[終了コード返却]
    F -->|No| J[SDKインストールのみ完了]
    I --> Z[終了]
    J --> Z
```

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

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非ゼロ | SDKインストールエラー | ネットワーク障害 | ネットワーク確認 |
| 非ゼロ | コマンド実行エラー | dotnetコマンド失敗 | コマンド引数確認 |

### リトライ仕様

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

### 障害時対応

1. ネットワーク接続を確認
2. .dotnet/ディレクトリの状態を確認
3. global.jsonのSDKバージョンを確認
4. 直接dotnet-install.shを実行してSDKをインストール

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1コマンド |
| 目標処理時間 | コマンド依存 |
| メモリ使用量上限 | 指定なし |

## 排他制御

特段の排他制御は行わない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | なし | なし |
| 進捗ログ | コマンド実行中 | dotnetコマンド出力 |
| 終了ログ | なし | なし |
| エラーログ | エラー発生時 | エラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | コマンド依存 | 開発者 |
| エラー件数 | 1件 | 開発者 |

## 備考

- _InitializeDotNetCli変数からdotnetのインストールディレクトリを取得
- シンボリックリンク解決により、どこからスクリプトが呼び出されても正しく動作
- 引数なしで実行した場合はSDKのインストールのみが行われる
- Windows版dotnet.cmdと同等の機能をLinux/macOS環境で提供
