# 画面設計書 39-niminst nsis

## 概要

本ドキュメントは、Nimコンパイラプロジェクトのインストーラ・パッケージ生成ツール「niminst」における「nsis」サブコマンドの画面設計書である。niminst nsisはWindows用のNSISインストーラを作成する機能を提供する。

### 本画面の処理概要

niminst nsisコマンドは、NSIS（Nullsoft Scriptable Install System）を使用してWindows向けのGUIインストーラを作成する機能を提供する。NSISはオープンソースのインストーラ作成システムで、小さなオーバーヘッドと高い柔軟性を持つ。

**業務上の目的・背景**：Windows環境では、GUIインストーラによる配布が一般的であり、ユーザーにとって使い慣れた方法である。NSISインストーラはインストール先の選択、スタートメニュー登録、アンインストール機能などの標準的なインストーラ機能を提供する。Inno Setupの代替として、より軽量なインストーラを作成できる。

**画面へのアクセス方法**：コマンドラインから`niminst nsis <ini-file>`の形式で実行する。Windows環境でNSIS（makensis.exe）がインストールされている必要がある。

**主要な操作・処理内容**：
1. INIファイルから設定を読み込み
2. generateNsisSetup()でNSISスクリプト（.nsi）を生成
3. build/install_{name}_{version}.nsiとして保存
4. makensis.exeを呼び出してインストーラを生成
5. 成功時は.nsiファイルを削除

**画面遷移**：
- 遷移元：niminstメイン画面
- 遷移先：なし（インストーラ生成完了後に終了）

**権限による表示制御**：特になし。CLIツールとして実行権限があれば使用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 30 | Niminst | 主機能 | Windows用NSISインストーラ作成 |

## 画面種別

CLIコマンド実行画面（NSISインストーラ作成）

## URL/ルーティング

```
niminst nsis <ini-file> [options]
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 | 例 |
|--------|-----|------|------|-----|
| ini-file | path | Yes | 設定ファイルパス | nim.ini |
| -o, --output | path | No | 出力ディレクトリ | build |

### INI設定項目（[NSIS]セクション）

| キー | 型 | 説明 | 例 |
|------|-----|------|-----|
| path | path | makensis.exeのパス | C:\NSIS\makensis.exe |
| flags | string | 追加フラグ | /V2 |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| {name}-{version}.exe | file | 生成されるNSISインストーラ |

## 表示項目

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| コマンド | コマンドライン | makensis呼び出しコマンド |
| エラー | "External program failed" | makensis失敗時 |

## イベント仕様

### 1-NSISインストーラ作成

nsisコマンドが実行されると以下の処理が行われる：

1. main()からactionNsisを検出
2. setupDist2()関数を呼び出し
3. generateNsisSetup()でNSISスクリプトを生成
4. build/install_{name}_{version}.nsiとして保存
5. makensis.exeを呼び出し：
   ```
   makensis.exe {flags} /O{outdir} {nsi-file}
   ```
6. 成功時（exitCode == 0）は.nsiファイルを削除
7. 失敗時はエラーメッセージを表示してプログラム終了

### 2-NSISスクリプト生成

generateNsisSetup()で以下の内容を含むスクリプトを生成：

1. インストーラ名、バージョン情報
2. インストール先ディレクトリ
3. ファイルセクション（バイナリ、ライブラリ、ドキュメント）
4. レジストリ設定
5. スタートメニュー/デスクトップショートカット
6. アンインストーラ設定

## データベース更新仕様

本ツールはファイルシステム操作のみを行い、データベースは使用しない。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| NSISスクリプト生成 | install_*.nsi | 一時生成 | NSISスクリプト |
| インストーラ生成 | {name}-{version}.exe | 生成 | NSISインストーラ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | 情報 | "{コマンド}" | makensis呼び出し時 |
| MSG002 | エラー | "External program failed" | makensis失敗時 |

## 例外処理

| 例外条件 | 処理内容 | エラーメッセージ |
|----------|----------|-----------------|
| makensisが見つからない | デフォルトパス使用 | なし（makensis.exeをそのまま使用） |
| makensis失敗 | プログラム終了 | "External program failed" |

## 備考

- NSISはNullsoft Scriptable Install Systemの略
- Windows環境でのみ実行可能（when defined(windows)）
- nsisSetup.pathが未設定の場合、"makensis.exe"をそのまま使用（PATHに依存）
- Inno Setupより軽量だが機能は少なめ
- nsis.nimfテンプレートでスクリプト形式を定義

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: setupDist2関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | niminst.nim | `tools/niminst/niminst.nim` | setupDist2()関数（593-607行目） |

**主要処理フロー**:
- **594行目**: generateNsisSetup()でスクリプト生成
- **595行目**: ファイル名生成
- **596行目**: スクリプト保存
- **597-607行目**: makensis呼び出し（Windows限定）

#### Step 2: テンプレートを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | nsis.nimf | `tools/niminst/nsis.nimf` | NSISスクリプトテンプレート |

### プログラム呼び出し階層図

```
main()
    │
    └─ [actionNsis] setupDist2()
            │
            ├─ generateNsisSetup() / スクリプト生成
            │
            ├─ writeFile() / .nsi保存
            │
            └─ [Windows]
                    │
                    ├─ execShellCmd("makensis ...")
                    │
                    └─ [成功] removeFile() / .nsi削除
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| niminst.nim | `tools/niminst/niminst.nim` | ソース | setupDist2()実装 |
| nsis.nimf | `tools/niminst/nsis.nimf` | テンプレート | NSISスクリプトテンプレート |
