# 画面設計書 37-niminst zip

## 概要

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

### 本画面の処理概要

niminst zipコマンドは、Nimコンパイラの配布用ZIPパッケージを作成する機能を提供する。主にWindows環境での配布に使用され、必要なバイナリ、ライブラリ、ドキュメント等を1つのZIPファイルにまとめる。

**業務上の目的・背景**：Windows環境ではtar.xz形式よりZIP形式の方が一般的であり、標準のエクスプローラーで解凍可能である。niminst zipはWindowsユーザー向けの簡便な配布形式を提供し、インストーラを使わない「ポータブル」な配布を実現する。

**画面へのアクセス方法**：コマンドラインから`niminst zip <ini-file>`の形式で実行する。7z（7-Zip）コマンドラインツールが必要。

**主要な操作・処理内容**：
1. INIファイルから設定を読み込み
2. 一時ディレクトリにパッケージ構成を構築
3. Windows用バイナリ（[WinBin]セクション）をbin/にコピー
4. 設定ファイル、ドキュメント、ライブラリをコピー
5. .nimbleファイルをコピー
6. 7zコマンドでZIP圧縮

**画面遷移**：
- 遷移元：niminstメイン画面またはkochビルドツール
- 遷移先：なし（ZIPファイル生成完了後に終了）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 30 | Niminst | 主機能 | Windows向けZIPパッケージ作成 |

## 画面種別

CLIコマンド実行画面（ZIPパッケージ作成）

## URL/ルーティング

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

## 入出力項目

### 入力項目

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

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| {name}-{version}.zip | file | 生成されるZIPパッケージ |

## 表示項目

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| カテゴリ | "Current category: {cat}" | 処理中のファイルカテゴリ |
| 警告 | "[Warning]"形式 | ファイルが見つからない場合 |
| エラー | "External program failed" | 7z失敗時 |

## イベント仕様

### 1-ZIPパッケージ作成

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

1. main()からactionZipを検出
2. xzDist(windowsZip=true)関数を呼び出し
3. 一時ディレクトリを作成（build/{name}-{version}/）
4. processFile()で各ファイルをコピー：
   a. [WinBin]のファイルをbin/にコピー
   b. [Config]〜[Other]のファイルをコピー
   c. [Windows]のファイルをコピー
   d. [Nimble]のファイルをコピー
   e. .nimbleファイルをコピー
5. 7zコマンドでZIP圧縮
   ```
   7z a -tzip {name}-{version}.zip {name}-{version}
   ```

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

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

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| ZIPパッケージ作成 | {name}-{version}.zip | 生成 | ZIPアーカイブ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | 情報 | "Current category: {cat}" | 各カテゴリ処理時 |
| MSG002 | 警告 | "[Warning] Source file doesn't exist: {src}" | ファイルが見つからない場合 |
| MSG003 | エラー | "External program failed (zip)" | 7z失敗時 |

## 例外処理

| 例外条件 | 処理内容 | エラーメッセージ |
|----------|----------|-----------------|
| 7zが失敗 | echoでエラー表示 | "External program failed (zip)" |
| ファイルコピー失敗 | 警告表示して継続 | "[Warning] Source file doesn't exist: {src}" |

## 備考

- 7z（7-Zip）コマンドラインツールがPATHに必要
- ZIPファイル名は{name.toLowerAscii}-{version}.zip形式
- windowsZip=trueの場合、Cソースは含まれない（バイナリのみ）
- c_codeディレクトリはxzパッケージのみに含まれる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | niminst.nim | `tools/niminst/niminst.nim` | xzDist()関数（609-680行目）、windowsZip=trueの分岐を確認 |

**主要処理フロー**:
- **641-644行目**: windowsZip=trueの場合、[WinBin]からbin/にコピー
- **646-649行目**: 各カテゴリのファイルをコピー
- **659-661行目**: 7zコマンドでZIP圧縮

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

```
main()
    │
    └─ [actionZip] xzDist(windowsZip=true)
            │
            ├─ processFile() × N
            │       │
            │       └─ copyFileWithPermissions()
            │
            └─ execShellCmd("7z a -tzip ...")
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| niminst.nim | `tools/niminst/niminst.nim` | ソース | xzDist()実装 |
