NSIS によるインストーラの作成2010年11月15日 | |
![]() はじめにNullsoft Scriptable Install System (NSIS) によるインストーラの作成メモ。使用バージョンは NSIS 2.46。 インストーラの作り方
スクリプトの書き方スクリプトの例次のような構成のプログラムを想定しよう。 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 | |
PENGUINITIS |