# 手動ビルド

Wails CLIは、プロジェクトに関する様々な面倒な作業を担ってくれていますが、ときにはプロジェクトを手動でビルドできたほうが望ましい場合もあるでしょう。 このドキュメントでは、CLIが実行する多くの操作や、これらの操作を別の手段で実現するための方法について説明します。

## ビルドプロセス

Wails CLIは、`wails build`コマンドまたは`wails dev`コマンドが使用されると、共通のビルドプロセスを実行します:

    - フロントエンド依存関係のインストール
    - フロントエンドのビルド
    - ビルドアセットの生成
    - アプリケーションのコンパイル
    - [任意] アプリケーションの圧縮

### フロントエンド依存関係のインストール

#### CLIが実行する手順

- `-s`フラグが指定された場合、この手順をスキップします。
- `wails.json`ファイル内で、`frontend:install`キーにインストールコマンドが記述されているかを確認します。
- 記述されていない場合、この手順をスキップします。
- 記述されている場合、フロントエンドディレクトリ内に`package.json`ファイルが存在するか確認します。 存在しない場合、この手順をスキップします。
- `package.json`ファイルの内容をもとに、MD5チェックサムを生成します。
- `package.json.md5`ファイルが存在するか確認し、存在する場合は、さきほど生成したMD5チェックサムと比較して、内容が変更されていないかどうかを確認します。 内容が同じ場合、この手順をスキップします。
- `package.json.md5`ファイルが存在しない場合、ファイルを作成し、さきほど生成したMD5チェックサムを書き込みます。
- この時点でビルドが必要と判断された場合、`node_modules`ディレクトリが存在しない場合、または`-f`フラグが指定された場合は、フロントエンドディレクトリ内でインストールコマンドを実行します。

#### 手動で実行する手順

コマンドライン、または`npm install`のスクリプトを用いて、この手順を実行してください。

### フロントエンドのビルド

#### Wails CLIでの手順

- `-s`フラグが指定された場合、この手順をスキップします。
- `wails.json`ファイル内で、`frontend:build`キーにビルドコマンドが記述されているかを確認します。
- 記述されていない場合、この手順をスキップします。
- 記述されている場合、フロントエンドディレクトリ内でコマンドが実行されます。

#### 手動で実行する手順

コマンドライン、`npm run build`のスクリプト、またはフロントエンドのビルドスクリプトを用いて、この手順を実行してください。

### アセットの生成

#### Wails CLIでの手順

- `-nopackage`フラグが指定された場合、この手順をスキップします。
- `build/appicon.png`ファイルが存在しない場合、デフォルトのファイルを作成します。
- Windowsの場合、[Windowsバンドル](#windows)の節を参照してください。
- `build/windows/icon.ico`ファイルが存在しない場合、`build/appicon.png`画像ファイルから新規作成します。

##### Windows

- `build/windows/icon.ico`ファイルが存在しない場合、`build/appicon.png`ファイルをもとに、256、128、64、48、32、16サイズのアイコンを新規作成します。 この処理は[winicon](https://github.com/leaanthony/winicon)によって実現しています。
- `build/windows/<projectname>.manifest`ファイルが存在しない場合、デフォルトバージョンから新規作成します。
- アプリケーションを本番ビルドとしてコンパイルします(上記のとおり)。
- [winres](https://github.com/tc-hib/winres)を使用して、アイコンとマニフェストをリンクできる`.syso`ファイルにバンドルします。

#### 手動で実行する手順

- [winicon](https://github.com/leaanthony/winicon)のCLIツール(または他の任意ツール)を使用して、`icon.ico`を作成します。
- アプリケーションの`.manifest`ファイルを作成または更新します。
- [winres CLI](https://github.com/tc-hib/go-winres)を使用して、`.syso`ファイルを生成します。

### アプリケーションのコンパイル

#### Wails CLIでの手順

- `-clean`フラグが指定された場合、`build`ディレクトリを削除して再作成します。
- `wails dev`コマンドの場合、デフォルトで次のGoフラグを使用するようにします: `-tags dev -gcflags "all=-N -l"`
- `wails build`コマンドの場合、デフォルトで次のGoフラグを使用するようにします: `-tags desktop,production -ldflags "-w -s"`
  - Windowsの場合: `-ldflags "-w -h -H windowsgui"`
- `-tags`フラグを使用してCLIに指定された追加タグを、デフォルトのタグに追記します。
- `-ldflags`フラグを使用してCLIに指定された追加のldflagsを、デフォルトのタグに追記します。
- `-o`フラグのパラメータをパススルーさせます。
- `-compiler`フラグで指定されたGoコンパイラを、コンパイル時に使用するようにします。

#### 手動で実行する手順

- 開発ビルドの場合、最小のコマンドは次のとおりです: `go build -tags dev -gcflags "all=-N -l"`
- 本番ビルドの場合、最小のコマンドは次のとおりです: `go build -tags desktop,production -ldflags "-w -s -H windowsgui"`
- `.syso`ファイルと同じディレクトリでコンパイルするようにしてください。

### アプリケーションの圧縮

#### Wails CLIでの手順

- `-upx`フラグが指定された場合、アプリケーションを圧縮するために、`upx`プログラムをデフォルト設定で実行します。
- `-upxflags`フラグも指定された場合、デフォルト設定の代わりにこれらのフラグを使用します。

#### 手動で実行する手順

- `upx [flags]`を手動で実行して、アプリケーションを圧縮します。
