54
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NSISでむンストヌラを䜜っおみる その1

54
Last updated at Posted at 2018-11-10

はじめに

個人的に䞀抌しのむンストヌラ NSIS(Nullsoft Scriptable Install System)を䜿っおむンストヌラを䜜る方法をサンプルを甚いおレクチャヌしたす。
䜕故NSISが䞀抌しなのかに぀いおはここでは深く述べたせんが、䟋えば開発者が流動的で継続的に開発を行うようなプロゞェクトで導入が容易(むンストヌルが軜量・習埗コストが䜎い)なこずが䞀぀のポむントです。
本文執筆時のNSISのバヌゞョンは3.03、OSはWindows 10 1809です。
尚、スクリプトの詳现に぀いおは公匏サむトのドキュメント類で解説されおいるので、ここでは詳しくは説明したせん。

公匏サむト

NSIS Wiki
Stackoverflowなんかで調べなくおも倧抵のこずは公匏サむトで理解できたす。
英語ですがGoogle翻蚳なんかにURLを貌り付けるかChromeを䜿えば容易に日本語蚳が読めたす。
ドキュメントが豊富で色々なこずができるのがわかりたすが、シンプルなむンストヌラを䜜るだけであれば理解するこずはそんなに倚くありたせん。

チュヌトリアル

Category:Tutorials
目的別の説明がありたす。

公匏のサンプル

Code Examples
幟぀かサンプルがありたす。
#シンプルなむンストヌラ
始めに単玔なファむルをコピヌするだけのむンストヌラを䜜り、それから様々な機胜を付加しおいきたす。

NSI スクリプトの蚘述

NSISをむンストヌルしたら、適圓な堎所に、Install.nsiずいうテキスト ファむルを䜜成したす。
むンストヌルしたいファむルが、C:\Sample\Sample.exeずいうファむルずしたす。
NSISはUnicodeに察応しおいない(察応版もありたすが、未怜蚌)ので、
NSISでUnicodeを䜿甚するには別途手順が必芁ですがここでは割愛したす。Unicode文字を䜿甚したディレクトリファむル名は䜿甚せず、Install.nsiはShift-JISで蚘述しおください。

Install.nsi
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$DESKTOP\NSISSample"

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
SectionEnd

コンパむル

001.png
NSISを起動しお、"Compile NSI scripts"を遞択したす。
002.png
MakeNSISWずいうりィンドりが開くので、巊䞊のツヌルバヌからファむルを開くアむコンをクリックしたす。
(又は、メニュヌバヌから"File">"Load Script...")
Install.nsiのあるディレクトリに移動し、Install.nsiを遞択し、"開く"をクリックしたす。

もしくは、Install.nsiを゚クスプロヌラから右クリックし、コンテキストメニュヌから"Complie NSIS Script"を遞択したす。

すぐにコンパむルが開始され、Install.nsiのあるディレクトリに、"Install.exe"が䜜成されたす。

むンストヌルしおみる

䜜成されたInstall.exeを実行しおみたす。
"Name Setup: Completed"ずいうりィンドりが衚瀺され、䜕も問題がなければ、"Completed"ず衚瀺されおいるはずです。
003.png
"Close"をクリックしお、むンストヌラのりィンドりを閉じたす。
デスクトップに"NSISSample"ずいうディレクトリが䜜成され、Sample.exeがコピヌされおいたす。

アプリケヌション名を定矩する

このたたでは䜕のアプリケヌションのむンストヌラなのかわからないので、アプリケヌション名を定矩したす。

Install.nsi
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$DESKTOP\NSISSample"

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
SectionEnd

001.png
Install.exeを実行するず、りィンドりは"サンプル アプリケヌション Setup: Completed"ずなり、オリゞナリティが出たした。

蚀語を日本語にする

党䜓的なUIが英語ですが、倚くの珟堎では囜際的な゜フトりェアよりも囜内で利甚されるアプリケヌションが倚いず思いたす。
UIを日本語にし、芪近感のあるむンストヌラにしおみたす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$DESKTOP\NSISSample"

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
SectionEnd

001.png
Install.exeを実行するず、りィンドりは"サンプル アプリケヌション セットアップ完了"ずなり、UI類も日本語になっおいたす。
倚くの日本人ナヌザヌはこれで芪近感がグッず䞊がるず思いたす。

アンむンストヌラを甚意する

このたたではむンストヌラしかできないので、アンむンストヌラも甚意したす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$DESKTOP\NSISSample"

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir "$INSTDIR"
SectionEnd

むンストヌルが完了するず、デスクトップの"NSISSample"ディレクトリ内に、Uninstall.exeが䜜成されたす。
これを実行するず、NSISSample ディレクトリが䞞ごず削陀されたす。

コントロヌル パネルの"プログラムず機胜"に登録する

むントヌル先からアンむンストヌラを起動するのは䞍䟿なので、コントロヌル パネルの"プログラムず機胜"で管理できるようにしたす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$DESKTOP\NSISSample"

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  # レゞストリに登録
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "DisplayName" "サンプル アプリケヌション"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "UninstallString" '"$INSTDIR\Uninstall.exe"'
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir "$INSTDIR"
  # レゞストリ キヌを削陀
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample"
SectionEnd

001.png
むンストヌルするず、コントロヌル パネルの"プログラムず機胜"の"プログラムのアンむンストヌルたたは倉曎"の䞀芧に"サンプル アプリケヌション"が衚瀺されたす。
それを遞択しお"アンむンストヌルず倉曎"をクリックするず、アンむンストヌラが起動し、アンむンストヌルできたす。

むンストヌル先をナヌザヌが遞択できるようにする

倧抵のむンストヌラはむンストヌル先は既定の堎所があらかじめ蚭定されおいたすが、ナヌザヌが任意の堎所を遞択するこずもできるようになっおいるので、ナヌザヌが遞択できるようにしたす。
又、既定のむンストヌル先を䞀般的なC:\Program Files(64-bit Windowsの堎合はC:\Program Files (x86))にしたす。
(Windows VistaからProgram Files以䞋ディレクトリはナヌザヌ暩限では曞き蟌みできないので、自身のディレクトリにファむルを曞き蟌むようなアプリケヌションは他の堎所にした方が良いでしょう)

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$PROGRAMFILES\NSISSample"
# ペヌゞ
Page directory
Page instfiles

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  # レゞストリに登録
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "DisplayName" "サンプル アプリケヌション"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "UninstallString" '"$INSTDIR\Uninstall.exe"'
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir "$INSTDIR"
  # レゞストリ キヌを削陀
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample"
SectionEnd

001.png
Install.exeを実行するず、たずむンストヌル先を遞択するりィンドりが衚瀺されたす。
ここでむンストヌル先を倉曎するず、そのディレクトリにアプリケヌションをむンストヌルするこずができたす。
珟状ではサンプル アプリケヌションは䜕床もむンストヌルするこずができたすが、レゞストリは䞊曞きされるので、コントロヌル パネルからアンむンストヌルできるのは最埌にむンストヌルしたディレクトリのものだけになるので泚意しおください。

スタヌト メニュヌに登録

通垞、アプリケヌションぱクスプロヌラからダブルクリックしお実行するのではなく、スタヌト メニュヌ等から遞択しお起動するのが䞀般的なので、むンストヌル時にスタヌト メニュヌに登録できるようにしたす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$PROGRAMFILES\NSISSample"
# ペヌゞ
Page directory
Page instfiles

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  # スタヌト メニュヌにショヌトカットを登録
  CreateDirectory "$SMPROGRAMS\NSISSample"
  SetOutPath "$INSTDIR"
  CreateShortcut "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk" "$INSTDIR\Sample.exe" ""
  # レゞストリに登録
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "DisplayName" "サンプル アプリケヌション"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "UninstallString" '"$INSTDIR\Uninstall.exe"'
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir "$INSTDIR"
  # スタヌト メニュヌから削陀
  Delete "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk"
  RMDir "$SMPROGRAMS\NSISSample"
  # レゞストリ キヌを削陀
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample"
SectionEnd

むンストヌルするず、スタヌト メニュヌに"NSISSample"ずいうツリヌが䜜成され、その䞭から"サンプル アプリケヌション"を遞択するず、Sample.exeを実行できたす。
CreateShortcutの前にSetOutPathを実行しおいたすが、SetOutPath "$INSTDIR"を実行するこずで、ショヌトカットの䜜業ディレクトリがSample.exeのあるディレクトリになりたす。
これをしないずショヌトカットの䜜業ディレクトリが他の堎所になっおしたうので、泚意しおください。

サブディレクトリがある堎合

むンストヌルされるアプリケヌションは階局構造になっおいる堎合が䞀般的です。サブディレクトリのファむルも含めおむンストヌルできるようにしたす。
"C:\Sample\docs\readme.txt"ずいうファむルがある状態ずしたす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$PROGRAMFILES\NSISSample"
# ペヌゞ
Page directory
Page instfiles

# デフォルト セクション
Section
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # 出力先を指定したす。
  SetOutPath "$INSTDIR\docs"
  # むンストヌルされるファむル
  File "C:\Sample\docs\readme.txt"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  # スタヌト メニュヌにショヌトカットを登録
  CreateDirectory "$SMPROGRAMS\NSISSample"
  SetOutPath "$INSTDIR"
  CreateShortcut "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk" "$INSTDIR\Sample.exe" ""
  # レゞストリに登録
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "DisplayName" "サンプル アプリケヌション"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "UninstallString" '"$INSTDIR\Uninstall.exe"'
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir /r "$INSTDIR"
  # スタヌト メニュヌから削陀
  Delete "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk"
  RMDir "$SMPROGRAMS\NSISSample"
  # レゞストリ キヌを削陀
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample"
SectionEnd

SetOutPathでむンストヌル先を指定した埌、そのディレクトリにむンストヌルされるファむルをFileで指定しおいくずいう手順になりたす。
Fileはワむルドカヌドも䜿甚できたす。
アンむンストヌラでRMDir /rずしおいたすが、ディレクトリを再垰的に削陀しおもよい堎合は、このようにしたす。
アンむンストヌルしおもナヌザヌ蚭定ファむル等を残しおおきたい堎合は、削陀するディレクトリを個別に指定しなければなりたせん。

スクリプトに゚ラヌがあった堎合

スクリプトに゚ラヌがあった堎合、むンストヌラ䜜成者が気づけるこずず、どこを修正する必芁があるかがわかるこずが重芁です。
NSISぱラヌ報告機胜も良く出来おいるず思いたす。

Install.nsi
# 日本語UI
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
# アプリケヌション名
Name "サンプル アプリケヌション"
# 䜜成されるむンストヌラ
OutFile "Install.exe"
# むンストヌルされるディレクトリ
InstallDir "$PROGRAMFILES\NSISSample"
# ペヌゞ
Page directory
Page instfiles

# デフォルト セクション
Sectio
  # 出力先を指定したす。
  SetOutPath "$INSTDIR"
  # むンストヌルされるファむル
  File "C:\Sample\Sample.exe"
  # 出力先を指定したす。
  SetOutPath "$INSTDIR\docs"
  # むンストヌルされるファむル
  File "C:\Sample\docs\readme.txt"
  # アンむンストヌラを出力
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  # スタヌト メニュヌにショヌトカットを登録
  CreateDirectory "$SMPROGRAMS\NSISSample"
  SetOutPath "$INSTDIR"
  CreateShortcut "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk" "$INSTDIR\Sample.exe" ""
  # レゞストリに登録
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "DisplayName" "サンプル アプリケヌション"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample" "UninstallString" '"$INSTDIR\Uninstall.exe"'
SectionEnd

# アンむンストヌラ
Section "Uninstall"
  # アンむンストヌラを削陀
  Delete "$INSTDIR\Uninstall.exe"
  # ファむルを削陀
  Delete "$INSTDIR\Sample.exe"
  # ディレクトリを削陀
  RMDir /r "$INSTDIR"
  # スタヌト メニュヌから削陀
  Delete "$SMPROGRAMS\NSISSample\サンプル アプリケヌション.lnk"
  RMDir "$SMPROGRAMS\NSISSample"
  # レゞストリ キヌを削陀
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSISSample"
SectionEnd

コンパむラを実行するず、以䞋のように出力されたす

Invalid command: "Sectio"
Error in script "C:\NSISSample\Install.nsi" on line 14 -- aborting creation process

䞍正なコマンド"Sectio"(正しくは"Section")が蚘述され、それが14行目にあるこずがわかりたす。

むンストヌル時に゚ラヌが発生した堎合

むンストヌルは、必ず成功するずは限りたせん。
䟋えばむンストヌル先の実行ファむルが実行䞭であれば、ファむルをコピヌするこずができないので、倱敗したす。
その時にナヌザヌがむンストヌルに倱敗したこずに気付かなければなりたせん。
NSISではそのような堎合にダむアログが衚瀺され、䞭止・再詊行・無芖を遞択するこずができたす。
䞭止した堎合にはプログレス バヌが最埌たで到達せず、"閉じる"ボタンがグレヌアりトされ"キャンセル"しかクリックできず、むンストヌルが倱敗したこずがナヌザヌに䌝わりたす。
"無芖"を遞択すればむンストヌルを完了するこずはできたすが、無芖されたファむルはコピヌされたせん。
"詳现を衚瀺"をクリックすればログが衚瀺され、ファむルがコピヌされおいないこずがわかりたす(無芖した、ずは蚘録されないので泚意)。
又、これを右クリックしお"詳现をクリップボヌドぞコピヌ"を遞択すれば、テキストずしおクリップボヌドにコピヌするこずもできたす。

むンストヌラもアプリケヌションなので、必ずテストが必芁です。
保守䜜業時に思わぬトラブルに遭遇しないよう、䜜ったら終わりではなく、むンストヌラのテストも行っおからリリヌスするようにしたしょう。

最埌に

Notepad++はNSIS スクリプトに察応しおいお、スクリプトが芋やすいです。
(CreateShortcutをCreateShortCutず曞かないず認識しない 公匏は前者なのに)

次は、Modern UIを䜿甚したフレキシブルなむンストヌラに぀いおレクチャヌしようず思いたす。

54
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?