1. はじめに
47代Masamiです。
この記事はMIS.W Advent Calendar 2014 3日目の記事になります。
2. Inno Setupとは
以下の画面のようなインストーラを作ることが出来ます。左に表示される画像は変更可能ですが、今回は触れません。
フリーウェアであり、オープンソース・ソフトウェアでもあります。
基本的に、商用/非商用問わず利用可能ですが、詳しいことはLICENSEを読みましょう。
Inno Setup Licenseという独自のLICENSEです。
また、自動でアンインストーラを作ってくれたり、自動でデスクトップにショートカットを作成してくれたり、スタートメニューにショートカットを作成してくれたり、インストール完了後自動でゲームを起動してくれたり、まあ色々やってくれます。設定次第ですが。便利。
ちなみに東方Projectのインストーラもこれで作られているみたいですね。
つまりああいうのがフリーで作れるっていうことです。脱!ZIP配布。
3. Inno Setupのインストール
公式サイトからダウンロードします。
QuickStart Packは、サードパーティ製だけど便利なものも一緒にインストールしてくれるパッケージなので、今回はこれを使います。
また、Unicode版があるのでこれを使います。
これを書いている時の最新バージョンは5.5.5なので、ispack-5.5.5-unicode.exe を落としましょう。
インストール時に色々と同時にインストールしますかとダイアログが出ますが、全て有用なので全部にチェックを入れると良いです。
それぞれの詳しい説明は省きますが、初めに出てくるInno Script Studioはこのあと使います。
4. 作って学ぶ
Inno Setupでのインストーラは、インストーラ作成用のスクリプト(拡張子.iss)をコンパイルして作るので、先ほどいれたInno Script Studioはまあいらないといえばいらないのですが、自動補完やGUI操作が地味に便利だったりするので、今回はそれを使って説明します。
4.1. 前準備
サンプルとして、今回は以下のフォルダ構成を元にインストーラを作ります。
- sampleapp.exe
- README.txt
sampleapp.exeが実行するゲーム、README.txtはりーどみーです。
4.2 IDEという便利ななにか
Inno Script Studioを起動します。
ちなみに日本語版は無いですが、まあなんとかなります。
今回はスクリプトを一から書いていくので下部のCancelを押します。
この画面にインストーラ作成のためのコードを書いていきます。
4.3 Inno Setup用のScript事始め
おもむろにインストール用スクリプトコードを書きます。詳しい説明は後で。
#define MyAppName "sampleapp"
#define MyAppVersion "1.0"
#define MyAppDirName "MIS.W\sampleapp"
[Setup]
AppName = {#MyAppName}
AppVersion = {#MyAppVersion}
DefaultDirName = {pf}\{#MyAppDirName}
[Languages]
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
[Files]
Source: "sampleapp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "README.txt"; DestDir: "{app}"; Flags: ignoreversion
このコードをさっきの画面にコピペして、セットアップに含めたいファイルがあるフォルダのカレントディレクトリにsampleapp.issなどと名前をつけて保存します。
以下の画像の赤丸をクリックするとBuildが開始されます。
特にエラーが起きなければ、.issファイルがあるフォルダにOutput/setup.exeというファイルが出来ます。
このsetup.exeがインストーラです。おもむろにCDに焼き始める前に自分の環境に入れてみると良いです。
4.4 Script解説編の前に
#define id token
Inno Setupではプリプロセッサを利用することが出来ます。
これはC言語のプリプロセッサによく似ていて、上の例では、MyAppNameに”sampleapp”を関連付けています。
ちなみに呼び出しは{#MyAppName}のようにします。
[section]
と角括弧で書いてあるものはセクションの宣言です。次のセクションの宣言が来るか、ファイルの終端が来るまでがひとつのセクションとなります。
上の例では、[Setup]、[Languages]、[Files]の3つのセクションがあります。
name=value
と書いてあるのはパラメータです。上の例では、AppNameに{#MyAppName}(= “sampleapp.exe”)を設定しています。
; comment
セミコロン(;)から始まる行はコメント扱いになります。
4.5 Script解説編
4.5.1 [Setup] Section
[Setup] Sectionでは、インストーラで用いる基本的な値を設定します。
[Setup]
; インストールウィザードのタイトルなどに表示されます。
AppName = {#MyAppName}
; アプリのバージョンです。
AppVersion = {#MyAppVersion}
; アプリをインストールさせるフォルダのデフォルト表示です。
DefaultDirName = {pf}\{#MyAppDirName}
{pf}はProgram Filesの略で、C:\Program Filesなどです。(ユーザの環境によって変わります。)
インストールウィザードのタイトルが {#AppName} セットアップ 、インストール先フォルダのデフォルトの値が{pf}{#MyAppDirName}になっているのがわかります。
4.5.2 [Language] Section
[Languages]
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
[Language] Sectionでは、インストールウィザードで用いる言語を指定します。指定しないと英語になるので、上記では日本語を指定しています。
4.5.3 [Files] Section
[Files] Sectionでは、実際にインストールさせるファイルを指定します。
[Files]
Source: "sampleapp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "README.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "name"; DestDir: "dir"; Flags: flags
の形で記述します。
Sourceはインストールさせるファイル名、DestDirはインストールさせる先、Flagsは指定しておくとそのファイルをインストールさせるときに色々やってくれます。
{app}はさっきの上の画面で指定したインストール先フォルダを表します。標準ではDefaultDirNameで指定した場所になります。
また、ignoreversion フラグを指定しておくと、ファイルの日付やバージョンなどを無視して上書きしてインストールしてくれます。
なので、上の例では、”sampleapp.exe”と”README.txt”を、DefaultDirNameで指定した場所に強制上書きで入れる、ということになります。
4.6 実用性を持たせる
最後に、ゲームをスタートメニューに表示させ、デスクトップにショートカットを起き、インストールが完了した後ゲームを起動させるインストーラを作ります。
また、作成者情報やサポートURLも記載させるようにしています。
#define MyAppName "sampleapp"
#define MyAppVersion "1.0"
#define MyAppPublisher "MIS.W"
#define MyAppURL "http://misw.jp"
#define MyAppExeName "sampleapp.exe"
#define MyAppDirName "MIS.W\sampleapp"
#define MyAppMutex "http://misw.jp/sampleapp"
[Setup]
AppName = {#MyAppName}
AppVersion = {#MyAppVersion}
AppVerName = {#MyAppName} {#MyAppVersion}
AppPublisher = {#MyAppPublisher}
AppPublisherURL = {#MyAppURL}
AppSupportURL = {#MyAppURL}
AppUpdatesURL = {#MyAppURL}
DefaultDirName = {pf}\{#MyAppDirName}
DefaultGroupName = {#MyAppDirName}
OutputBaseFilename = setup_{#MyAppName}
AppMutex = {#MyAppMutex}
UninstallDisplayIcon = {app}\sampleapp.exe
[Languages]
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
[Files]
Source: "sampleapp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "README.txt"; DestDir: "{app}"; Flags: ignoreversion
[Tasks]
Name: startmenu; Description:"スタートメニューにショートカットを作成する(&P)"; Flags:
Name: desktopicon; Description: "デスクトップにアイコンを作成する(&D)"; Flags:
[Icons]
Name: "{group}\sampleapp"; Filename: "{app}\sampleapp.exe"; Tasks: startmenu; WorkingDir: "{app}"
Name: "{group}\sampleappのアンインストール"; Filename: "{uninstallexe}"; Tasks: startmenu
Name: "{commondesktop}\sampleapp"; Filename: "{app}\sampleapp.exe"; Tasks: desktopicon; WorkingDir: "{app}"
[Run]
Filename: "{app}\sampleapp.exe"; Description: "インストール完了後ゲームを起動する"; Flags: postinstall shellexec skipifsilent
詳しい説明を書くには余白が狭すぎる
セクション名やパラメータ名でそれとなく推論して下さい
5. まとめ
Inno Setupは便利
これを使うだけでそれっぽく見えるのでは
寿司 虚空編が突然連載終了してもう生きる希望がない
6. 参考文献
参考にしました
これを読んだら良いのでは