NSIS によるインストーラの作成

2010年11月15日

はじめに

Nullsoft Scriptable Install System (NSIS) によるインストーラの作成メモ。使用バージョンは NSIS 2.46。

インストーラの作り方

  1. スクリプトを書く。
  2. NSIS を起動し、"Compile NSI scripts" をクリック。
  3. "Load Script..." ボタンをクリックしてスクリプトを選択。
  4. スクリプトに問題がなければインストーラが完成。
  5. インストーラを起動するとインストールが始まる。

スクリプトの書き方

スクリプトの例

次のような構成のプログラムを想定しよう。

test.zip (test.nsi 以外空ファイル)

test.nsi
package/
  |
  + README.txt
  + prog.exe
  + doc/
  |   |
  |   + manual.pdf
  |
  + sample/
      |
      + sample1.txt

ここで test.nsi が NSIS のスクリプトである。

test.nsi

; NSIS Script

!include "MUI2.nsh"

セミコロンからはじまる行はコメント。"!include" はインクルードの命令で、ここではかっこいいインストーラを作るためのオマジナイ。

!define NAME "test"
!define VERSION "0.1"
!define PACKAGE "${NAME} ${VERSION}"
!define APPDIR "package"

"!define" は定数定義の命令。プログラムの名前やバージョンを設定している。

Name "${PACKAGE}"
OutFile "${NAME}-${VERSION}.exe"

プログラムの名前とインストーラのファイル名の設定。

InstallDir "$PROGRAMFILES\${PACKAGE}"
InstallDirRegKey HKLM "SOFTWARE\${PACKAGE}" ""

インストールディレクトリとレジストリキーの設定。

RequestExecutionLevel admin

実行権限の指定。"admin" だと管理者しか実行できない。"user" ならば制限ユーザーでも実行できる。

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
 
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-uninstall-r.bmp"
 
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp"

インストーラの見た目の設定。好みの問題。

!define MUI_ABORTWARNING

これが定義されていると、インストールを中断するときに警告を出す。

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

インストールのページ設定。順番に、ようこそページ、インストール先フォルダ指定ページ、インストール中ページ、完了ページ。

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

アンインストールのページ設定。順番に、ようこそページ、アンインストール確認ページ、アンインストール中ページ、完了ページ。

!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Japanese"

言語設定。デフォルトは英語、"Japanese" を加えておけば OS の言語設定が日本語の場合にインストーラのメッセージが日本語になる。

Section

  SectionIn RO

  SetOutPath $INSTDIR
  File "${APPDIR}\README.txt"
  File "${APPDIR}\doc\manual.pdf"
  File /r "${APPDIR}\sample"
  
  SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PACKAGE}"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\manual.lnk" "$INSTDIR\manual.pdf"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\sample.lnk" "$INSTDIR\sample"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\Uninstall.lnk" "$INSTDIR\uninstall.exe"

  WriteRegStr HKLM SOFTWARE\${NAME} "" "$INSTDIR"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE}" \
      "DisplayName" "${PACKAGE} (remove only)"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE}" \
      "UninstallString" '"$INSTDIR\uninstall.exe"'
  
  WriteUninstaller "uninstall.exe"
  
SectionEnd

インストール処理の記述。以下でそれぞれ説明する。

  SetOutPath $INSTDIR
  File "${APPDIR}\README.txt"
  File "${APPDIR}\doc\manual.pdf"
  File /r "${APPDIR}\sample"

"File" は直前の "SetOutPath" で設定されたパスにファイルをコピーする。"/r" オプションをつけるとフォルダごとコピーする。ここではインストール先フォルダ $INSTDIR (InstallDir で指定したディレクトリ) にパッケージの README.txt, doc/manual.pdf, sample フォルダをコピーしている。

  SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\${PACKAGE}"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\manual.lnk" "$INSTDIR\manual.pdf"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\sample.lnk" "$INSTDIR\sample"
  CreateShortCut "$SMPROGRAMS\${PACKAGE}\Uninstall.lnk" "$INSTDIR\uninstall.exe"

スタートメニューの設定。"SetShellVarContext all" は "All Users" のスタートメニューを使うことを指示している。それ以降はフォルダを作りその中にショートカットを作っている。

  WriteRegStr HKLM SOFTWARE\${NAME} "" "$INSTDIR"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE}" \
      "DisplayName" "${PACKAGE} (remove only)"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE}" \
      "UninstallString" '"$INSTDIR\uninstall.exe"'
  
  WriteUninstaller "uninstall.exe"

アンインストーラの登録と作成。

Section Uninstall

  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGE}"
  DeleteRegKey HKLM "SOFTWARE\${PACKAGE}"

  RMDir /r "$INSTDIR"
  
  SetShellVarContext all
  RMDir /r "$SMPROGRAMS\${PACKAGE}"

SectionEnd

アンインストール処理の記述。レジストリ、インストールフォルダ、スタートメニューのフォルダを削除している。

環境変数の取得

環境変数を取得するには "ReadEnvStr" を使う。

ReadEnvStr $0 "PATH"

"$0" は変数。

指定した環境変数が存在しない場合はエラーが発生する。エラーの発生によって処理を分岐させたい場合は、たとえば次のようにする。

ClearErrors
ReadEnvStr $0 "TEST_PATH"
IfErrors +2 0
  Call install_test

"ClearErrors" でエラーフラグをクリアし、環境変数を読み込む。"IfErrors" でエラーの発生を調べ、エラーが発生していれば 2 行あとに進み ("+2")、エラーが発生していなければ次の命令に進む ("0")。"Call" ではユーザー定義の関数を呼び出している。

変数の内容で分岐させたい場合は "StrCmp" を使う。

StrCmp $0 "debug" 0 +3
  Call install_debug
  Goto +2
  Call install_release

上の例では "$0" が "debug" であれば関数 install_debug が呼ばれ、さもなければ関数 install_release が呼ばれる。

関数

次のように関数を定義できる。

Function install_test
  CreateDirectory "$0\test"
  
  SetOutPath "$0\test"
  File "${APPDIR}\test\test.exe"
  ...

FunctionEnd

関数の呼び出しは "Call" で行う。

Call install_test