Ubuntu Weekly Recipe

第409回Windows用のインストーラーを作成する

今回はNSISを利用し、Windows用のインストーラーを作成します(注:この連載ではUbuntuを扱っています⁠⁠。

NSISとは

NSISは、Winampで有名なNullsoftが開発している、スクリプトベースのWindows用インストーラー作成ソフトです。簡単に済ませたい場合はとことん簡単にできますし、手間をかければ凝ったこともできるので、いろいろなソフトウェアで使われています。

今回は、普通のインストーラーとレジストリを変更するだけのツールを作成してみます。

正直なところNullsoftの現状はよくわからないのですが、NSISはオリジナルメンバーによって現在も細々と開発が継続しており、執筆段階での最新版 (2.50/3.0b3) が2015年12月26日にリリースされています。

UbuntuとNSIS

NSISはオープンソースライセンスで提供されています。そして、NSISそのものはWindowsでなくても動作します。実はUbuntuのリポジトリにもありますので、簡単にインストールできます。そして、実行してWindows用インストーラーを作成することもできます。しかし、言うまでもありませんがテストというかインストーラーを実行することはできません。もちろんWineがインストールされていればインストーラーの実行自体は可能です。

それ以前にUbuntuでNSISを使用するメリットを明確に説明せよと言われると、正直すごく困ってしまいます。あえて言えばapt一発でダウンロードできること、他のコマンドと組み合わせ、例えばインストールするファイルをwgetやcurlで取得してそれを展開するといったことを簡単に書けるというメリットはありますが、Cygwinを使用すればWindowsでも同様になるはずなので(未検証⁠⁠、メリットと言えるほどのものはありません。

サンプルスクリプトその1:画像インストーラー

まず簡単なサンプルとして、画像ファイルをWindows XPだと「マイ ピクチャ」フォルダー、Windows 7/10だと「ピクチャ」フォルダーにインストールするインストーラーを作成してみます。

以下のコードをファイル名"image-installer.nsi"、文字コードをSHIFT_JISで保存してください(そのまま保存すればSHIFT_JISになっています⁠⁠。geditでもSHIFT_JISでの保存は可能です。改行コードはLFでもCR+LFでもどちらでも構いません。

次のコマンドを実行して、インストーラーを作成します。

makensis image-installer.nsi

今回のコードはサンプルスクリプトに多少の手を加えたものです。コメントも多いのでわかりやすいと思いますが、ポイントとなる部分をいくつか解説します。

  !include "MUI2.nsh"

ここではModern UI 2.0を使用しています。これは日本語にも対応しています。今回は紹介しませんがいろいろカスタマイズもできるので、よほどの理由がない限りはこのフォントを使用するのがいいでしょう。

  ;Name and file
  Name "画像インストーラー"
  OutFile "image-install.exe"

  ;Default installation folder
  InstallDir "$PICTURES"

インストーラーの名前と実行ファイル名とインストールフォルダーを指定しています。インストールフォルダーは前述のとおりWindowsのバージョンにより異なっているため、このような定数を使用しています。他の定数に関しては、マニュアルに記載がありますので参考にしてください。

  !define MUI_ABORTWARNING
  ;!define MUI_ICON "penguin.ico"
  ;!define MUI_UNICON "penguin.ico"

サンプルスクリプトではコメントアウトにしていますが、このように書けば独自のアイコンを使用できます。なお、ico形式へのエクスポートはGIMPでも可能です。エクスポート時に拡張子を"ico"にしてください。

なお、実際に作成したインストーラーは、このアイコンに差し替えています。

;Pages

  !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  

インストール/アンインストール時に行うことを指定しています。上からようこそ画面、フォルダーの指定、実際のインストール(ファイルのコピー⁠⁠/アンインストール、完了しました画面の4つを行います。今回はインストールフォルダーを指定する意味はないので、削ってもいいかもしれません。

;Languages
 
  !insertmacro MUI_LANGUAGE "Japanese"

インストーラーの言語は日本語にしたいので、このように指定しています。

;--------------------------------
;Installer Sections

Section

  SetOutPath "$INSTDIR"
  
  ;ADD YOUR OWN FILES HERE...
  ;https://openclipart.org/detail/159703/penguin-|-pinguino
  File Twitter-Penwin.svg
  
  ;Store installation folder
  WriteRegStr HKCU "Software\image-installer" "" $INSTDIR
  
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

重要なのは"File"行で、実際にインストールするファイルを指定しています。この指定方法だと、"image-installer.nsi"と同じフォルダーに置く必要があります。

;Uninstaller Section

Section "Uninstall"

  ;ADD YOUR OWN FILES HERE...
  Delete "$INSTDIR\Uninstall.exe"
  Delete "$INSTDIR\Twitter-Penwin.svg"

  DeleteRegKey /ifempty HKCU "Software\imaage-installer"

SectionEnd

アンインストールで重要なのは"Delete"行で、アンインストールするファイルを一つひとつ指定しています。今回はアンインストール実行プログラムも画像ファイルと同じ場所に置いてるので、ややダサいです。しかし、ユーザー権限でインストールしている以上、やむを得ない部分でもあります。

コメントも含めて100行にも満たないスクリプトですが、Wineでインストールしてみると、以下のように本格的なインストーラーとなります。なお、Wineは気が効いており、画像ファイルは"XDG_PICTURES_DIR"にインストールされます。すなわち日本語でインストールした場合は"$HOME/画像"フォルダーにインストールされます。

図1 ようこそ画面
画像
図2 インストールフォルダーの指定。右上がアイコン画像に差し替わっている
画像
図3 完了しました画面
画像

サンプルスクリプトその2:レジストリ変更ツール

WindowsでNATトラバーサルを有効にするためには、レジストリを変更する必要があります。Windows 10でも同様というのはいかがなものかと思うわけですが、それはさておきWindowsでVPNを使用したい場合は必須の変更といえます。しかし、レジストリの変更など手動では行いたくありません。NSISは当然のことながらレジストリの変更もできるので、使わない手はないでしょう。

ということで次のサンプルはレジストリの変更ツールです。以下のコードをファイル名"nat-t_reg.nsi"、文字コードをSHIFT_JISで保存してください(そのまま保存すればSHIFT_JISになっています⁠⁠。

次のコマンドを実行して、インストーラーを作成します。

makensis nat-t_reg.nsi

コードをいくつか解説します。

;General

  ;Name and file
  Name "NATトラバーサル対応レジストリ変更ツール"
  OutFile "nat-t_reg.exe"

  ;Request application privileges for Windows Vista
  RequestExecutionLevel admin

今回はAdministrator権限が必要なため、"RequestExecutionLevel"は"admin"にしてあります。

;Interface Settings

  !define MUI_ABORTWARNING
  !define MUI_WELCOMEPAGE_TITLE '実際には何のファイルもインストールしません。'
  !define MUI_WELCOMEPAGE_TITLE_3LINES

注意を追加するため、このようにしました。

Section
  ClearErrors
  ReadRegDWORD $0 HKLM "SYSTEM\CurrentControlSet\Services\PolicyAgent" "AssumeUDPEncapsulationContextOnSendRule"
  ${If} ${Errors}
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\PolicyAgent" "AssumeUDPEncapsulationContextOnSendRule" "2"
    MessageBox MB_OK "レジストリを書き換え、NATトラバーサルを有効にしました"
  ${Else}
    ${IF} $0 == ""
                WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\PolicyAgent" "AssumeUDPEncapsulationContextOnSendRule" "2"
                MessageBox MB_OK "レジストリを書き換え、NATトラバーサルを有効にしました"
          ${ELSE}
                MESSAGEBOX MB_OK "すでに値が書き込まれているため何もしません。現在の値は $0 です"
          ${ENDIF}
  ${EndIf}
SectionEnd

ここもサンプルコードを参考にしているのですが、まずはエラーフラグを初期化して、該当のレジストリ部分を読み取って変数"$0"に入れます。エラーが返ってくる場合、すなわち値が何もない場合は作成し、値を"2"にします。存在していても値が空の場合はやはり"2"にします。何かしら値がある場合は何もしません。いずれの場合も、ダイアログでメッセージを表示します。

Ubuntu上では何の効果もありませんが、このプログラムもWineで動作することを確認しました。

図4 文言を変更したようこそ画面
画像
図5 レジストリ変更後のダイアログ表示
画像
図6 完了しました画面
画像
図7 Wineのレジストリエディター(!)で書き換えられているのを確認
画像

おすすめ記事

記事・ニュース一覧