フリーソフト

« 1. Introduction to NSIS - NSIS Users Manual | トップページ | 3. Command Line Usage - NSIS Users Manual »

2. Tutorial: The Basics - NSIS Users Manual

これはNSIS Users Manualの非公式な日本語ドキュメントです。本コンテンツの利用によって生じたいかなる損害も、著者は一切の責任をとることができませんので、自己責任での利用をお願いします。読みやすさを重視するため必ずしも原文に忠実でない部分があります。また、誤りが含まれている可能性もあります。必ず原文をご確認ください。 訳者:Kawai

前へ | 目次 | 次へ

第2章: チュートリアル: 基本

2.1 はじめに

[原文]

ダウンロードあるいは購入したソフトウェアパッケージの多くには、インストーラが付属しています。インストーラはファイルをコピーしたり、更新したり、レジストリキーを書き込んだり、設定を書き込んだり、ショートカットを作成したり、と様々な処理を実行します。これらは、すべて自動的に実行されます。ユーザはいくつかの情報を入力するだけで、残りはインストーラがやってくれます。ユーザはウェザードを通じて適切なオプションを選択し、インストーラが完了するまで待ちます。インストーラが完了した後、ユーザに残されているのはプログラムを開始するという単純なタスクだけです。必要なステップはすべてインストーラによって実行されていますので、何か忘れていないかと心配する必要はありません。

NSIS はインストーラを作成するための開発者用のツールです。NSIS によって、ファイルをコピーするだけの基本的なインストーラから、レジストリキーを書き込んだり、環境変数を設定したり、最新のファイルをインターネットからダウンロードしたり、設定ファイルをカスタマイズしたり、など多くのタスクを実行する複雑なインストーラまで、あらゆるインストーラを作成することができます。NSIS は非常に柔軟で、そのスクリプト言語は簡単に習得が可能です。

NSIS は、すべてのインストールファイルとスクリプトを単一の実行ファイルにコンパイルするため、アプリケーションを簡単に配布することができます。インストールデータに追加される NSIS 自身のコードは約 34KB のみです(標準的な設定の場合)。オーバーヘッドが非常に小さいにも関わらず、NSIS は強力なスクリプト言語と外部プラグインによって多くのオプションを提供することが可能です。

2.2 スクリプトファイル

[原文]

NSIS インストーラを作成するためには、まず NSIS スクリプトを書かなくてはいけません。NSIS スクリプトは特別な文法で記述されるテキストファイルです。スクリプトは、様々なテキストエディタで編集することが可能です。NSIS は、エラーやエラーの恐れがある箇所を、行番号を利用して警告するため、行番号が表示できるテキストエディタをおすすめします。構文強調表示がサポートされているエディタもおすすめです。NSIS Wiki から、NSIS 専用のエディタと構文強調表示のためのファイルをダウンロードすることが可能です。

NSIS スクリプトにおいて、すべての行はコマンドとして扱われます。コマンドが長すぎる場合は、行末にバックスラッシュ \ を書いて行を分割することができます。コンパイラは、分割された行を新しいコマンドとはみなさず、前の行の続きとして扱います。例を示します。

Messagebox MB_OK|MB_ICONINFORMATION \
"This is a sample that shows how to use line breaks for larger commands in NSIS scripts"

文字列の中でダブルクォテーションを使用したい場合は、$\" のようにエスケープしたり、` や ' のような別の引用記号で文字列をクォートしたりします。

スクリプトファイルの詳細については、 スクリプトファイルの形式 を参照してください。

スクリプトファイルのデフォルトの拡張子は .nsi であり、ヘッダファイルの拡張子は .nsh です。ヘッダファイルを利用することによって、スクリプトを複数のコードブロックに分割したり、ヘッダファイルに関数やマクロを置き、複数のインストーラからインクルードしたりすることが可能です。これによって更新が容易となり、またスクリプトを読みやすくすることができます。ヘッダファイルをインクルードするには、!include を利用します。NSIS ディレクトリの下のインクルードディレクトリにあるヘッダファイルは、ファイル名だけでインクルードできます。例を示します。

!include Sections.nsh

2.3 スクリプトの構造

[原文]

NSIS スクリプトには、「インストーラ属性(Installer Attribute)」と「セクション(Section)」、「関数(Function)」を記述することができます。また、コンパイル時の制御のために「コンパイラ指令(Compiler Command)」を利用することも可能です。スクリプトには少なくとも、インストーラの出力先を指定する OutFile 命令と、ひとつ以上のセクションが必要です。

2.3.1 インストーラ属性

[原文]

インストーラ属性コマンドはインストーラの挙動と見た目を決定します。これらの属性によって、インストール時に表示するテキストを変更したり、インストールタイプの数を変更したりすることができます。これらのコマンドの多くは、実行中に変更することができません。

その他の基本的な命令としては NameInstallDir があります。

インストーラ属性コマンドの詳細については、 インストーラ属性 を参照してください。

2.3.2 ページ

[原文]

サイレントではないタイプのインストーラは、インストールの設定を入力するためのウィザードページを持ちます。どのページを表示するかは、Page (あるいは、より高度な設定のための PageEx )コマンドによって設定します。典型的な Page コマンドの使用例は以下のようです。

Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

これらの Page コマンドは、インストーラにおいて、使用許諾、インストールするコンポーネントの選択画面、インストールディレクトリの選択画面を表示し、最後に instfiles ページで選択されたコンポーネントをインストールします。アンインストーラにおいては、確認ページを表示した後、instfiles ページでアンインストールを実行します。

2.3.3 セクション

[原文]

通常のインストーラでは、いくつかのコンポーネントを選択してインストールすることができます。例えば、NSIS のインストーラでは、ソースコード、追加のプラグイン、サンプルなどのインストールコンポーネントが選択できます。NSIS では、各コンポーネントは、それぞれに対応するコードを持ちます。ユーザが、あるコンポーネントのインストールを選択した場合、インストーラは対応するコードを実行します。スクリプトでは、このコードはセクションで定義されます。各セクションは、コンポーネントページにおける各コンポーネントに対応します。セクションの名前はコンポーネントの表示名となります。セクションがひとつだけのインストーラをビルドすることも可能ですが、コンポーネントページを利用してユーザにインストールするコンポーネントを選択させたい場合は、ひとつ以上のセクションを定義する必要があります。

アンインストーラも、複数のセクションを持つことができます。アンインストーラにおけるセクション名の前には、'un.' を付けます。例を示します。

Section "Installer Section"
SectionEnd

Section "un.Uninstaller Section"
SectionEnd

セクションに記述されるコードは、ユーザのコンピュータで実行時に実行されるものです。インストール属性における命令とは大きく異なります。これらの命令によって、ファイルを抽出したり、レジストリやファイルを読み書きしたり、ディレクトリを作成したり、ショートカットを作成したり、と様々な処理が実行できます。詳細については、命令 を参照してください。

最も基本的な命令は、どこにファイルを展開するかを指示する SetOutPath と、ファイルを抽出する File です。

例を示します。

Section "My Program"
  SetOutPath $INSTDIR
  File "My Program.exe"
  File "Readme.txt"
SectionEnd

セクションの詳細については、 セクション を参照してください。

2.3.4 関数

[原文]

関数には、セクションと同じようにスクリプトコードを記述することができます。関数とセクションの違いは呼び出しの方法です。関数には、ユーザ関数とコールバック関数の2種類があります。

ユーザ関数は、セクションや他の関数の中から Call 命令によって呼び出されます。ユーザ関数は、呼び出されるまで実行されることはありません。インストーラは、関数内のコードを実行した後、Call 命令の後ろに続く命令を実行していきます。ただし、関数内でインストールが中断された場合はこの限りではありません。ユーザ関数は、同じような命令を、インストーラの複数の箇所で実行する必要がある場合に、非常に役立ちます。関数の利用により、コードをコピーする手間が省け、コードのメンテナンスもより簡単になります。

コールバック関数は、「インストーラが開始した時」のようなイベント発生時に、インストーラによって呼び出されます。必要ない場合は、コールバックを設定しなくても構いません。例えば、インストーラの開始時にメッセージを表示したいなら、.onInit という名前の 関数を定義します。NSIS コンパイラは、.onInit という名前から、この関数はコールバック関数であると判断し、インストーラの開始時に呼び出します。

Function .onInit
  MessageBox MB_YESNO "プログラムをインストールします。続行しますか?" IDYES gogogo
    Abort
  gogogo:
FunctionEnd

Abort 命令はコールバック関数において特別な意味を持ちます。上述の例では、Abort は初期化を中止し、即座に終了することをインストーラに通知しています。コールバック関数の詳細については、 コールバック関数 を参照してください。

関数についての詳細は、 関数 を参照してください。

2.3.5 スクリプトの仕組み

[原文]

2.3.5.1 コードの論理構造

StrCmpIntCmpIfErrorsGoto によって、条件分岐や繰り返しを実現することができます。また LogicLib によって、より簡単に記述することも可能です。LogicLib は複雑な論理構造を簡単に実現するためシンプルなマクロを提供します。その構文は( LogicLib.nsh を参照)、他のプログラミング言語と類似しており、初心者にとっても、上級者にとっても、分かりやすいものです。

例えば、LogicLib を使用せずに、変数の値をチェックする場合は以下のようになります。

StrCmp $0 'some value' 0 +3
  MessageBox MB_OK '$$0 is some value'
  Goto done
StrCmp $0 'some other value' 0 +3
  MessageBox MB_OK '$$0 is some other value'
  Goto done
# else
  MessageBox MB_OK '$$0 is "$0"'
done:

それに対して、LogicLib を利用すると、より読みやすく、理解しやすいコードになります。以下に例を示します。

${If} $0 == 'some value'
  MessageBox MB_OK '$$0 is some value'
${ElseIf} $0 == 'some other value'
  MessageBox MB_OK '$$0 is some other value'
${Else}
  MessageBox MB_OK '$$0 is "$0"'
${EndIf}

同じことを Switch を使って実現することもできます。以下に例を示します。

${Switch} $0
  ${Case} 'some value'
    MessageBox MB_OK '$$0 is some value'
    ${Break}
  ${Case} 'some other value'
    MessageBox MB_OK '$$0 is some other value'
    ${Break}
  ${Default}
    MessageBox MB_OK '$$0 is "$0"'
    ${Break}
${EndSwitch}

複数条件もサポートされています。以下の例は $0 と $1 の両方が空である場合、ユーザに通知します。

${If} $0 == ''
${AndIf} $1 == ''
  MessageBox MB_OK|MB_ICONSTOP 'both are empty!'
${EndIf}

LogicLib では、ラベルや相対ジャンプを意識する必要がないため、スクリプトを変更するたびに、ラベル名の衝突を防いだり、ジャンプのオフセットを手動で調整したりする手間を省くことができます。

LogicLib は、while や do、 for といった繰り返し処理もサポートしています。以下はすべて、LogicLib を使って5までカウントする例です。

StrCpy $R1 0
${While} $R1 < 5
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${EndWhile}
${For} $R1 1 5
  DetailPrint $R1
${Next}
StrCpy $R1 0
${Do}
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${LoopUntil} $R1 >= 5

LogicLib を利用するには, 次の行をスクリプトの先頭に記述する必要があります。

!include LogicLib.nsh

その他の例については、 LogicLib.nsi を参照してください。

2.3.5.2 変数

変数($VARNAME)を宣言するには、Var コマンドを利用します。変数はグローバル変数であり、すべてのセクション、および関数から参照することができます。

ユーザ変数の宣言と利用の例です。

Var BLA ;変数の宣言

Section bla

  StrCpy $BLA "123" ;ここで変数 $BLA を使うことができる

SectionEnd

スタックも用意されています。スタックは、一時的な記憶領域としても利用が可能です。スタックにアクセスするには、PushPop コマンドを利用します。Push はスタックに値を追加し、Pop は値を取り出して変数にセットします。

共有コードにおいては、$0 や $R0のような 20個のレジスタ を利用することができます。これらの静的な変数は、宣言の必要がなく、名前の衝突もありません。これらの変数を共有コードの中で利用する場合は、まず始めに元の値をスタックに格納し、処理が終わった後で元の値に復元します。

以下の例では、変数には呼び出し前と同じ値が格納されます。複数の変数を利用する場合は、Push、Popの呼び出し順序に注意してください。スタックは、「last-in first-out(後入れ先出し)」です。

Function bla

  Push $R0
  Push $R1

    ...code...

  Pop $R1
  Pop $R0

FunctionEnd

2.3.5.3 デバッグスクリプト

NSIS を使えば使うほど、スクリプトはどんどん複雑になってきます。特に、多くの変数を扱う場合、誤りが混入する可能性が高まります。コードのデバッグを助けるための、いくつかの方法を紹介します。変数の内容を表示するには、 MessageBoxes あるいは DetailPrint を利用します。すべての変数の簡単な概要を取得するには、 DumpState プラグインを利用します。デフォルトでは、インストーラのすべてのアクションはログウインドウに出力されます。ログウインドウで右クリックし、「クリップボードに詳細をコピー」を選択すれば、ログにアクセスすることができます。ログを直接ファイルに出力する方法もあります。 ここ を参照してください。

[原文]

2.3.6 スクリプトの実行

ユーザがインストーラやアンインストーラを実行すると、スクリプトで定義された順番でページが表示されます。instfiles ページまで到達すると、選択されたコンポーネントに対応するセクションが、スクリプトで定義された順番で実行されます。コンポーネントページが表示されなかった場合は、すべて選択されたものと仮定して、すべてのセクションを実行します。

セクション以外のコードとしては、コールバック関数があります。コールバック関数が定義されている場合は、セクションのコードよりも前に実行されます。例えば、.onInit コールバック関数は、スクリプト内のどのコードよりも前に実行されます。ページ表示のある時点において実行される ページコールバック関数 もあります。

2.3.7 コンパイラ指令

[原文]

コンパイラ指令は、インストーラのコンパイル時に開発者のコンピュータにおいて実行される命令です。条件付コンパイルやヘッダファイルのインクルード、アプリケーションの実行、作業ディレクトリの変更などに利用されます。もっとも一般的なものは define です。define はコンパイル時の定数です。製品のバージョン番号を define で定義しておき、スクリプト内で利用したりすることができます。例を示します。

!define VERSION "1.0.3"
Name "My Program ${VERSION}"
OutFile "My Program Installer - ${VERSION}.exe"

詳細については、 条件付コンパイル を参照してください。

もうひとつの代表的な利用方法はマクロです。マクロは、コンパイル時にコードを挿入するために利用されます。マクロでは、define の値が使用されます。マクロのコマンドはコンパイル時に挿入されます。これにより、汎用的なコードを一度だけ記述しておき、それを少しだけ修正して何度も利用したりすることが可能となります。例を示します。

!macro MyFunc UN
Function ${UN}MyFunc
  Call ${UN}DoRegStuff
  ReadRegStr $0 HKLM Software\MyProgram key
  DetailPrint $0
FunctionEnd
!macroend

!insertmacro MyFunc ""
!insertmacro MyFunc "un."

このマクロによって、インストーラ用とアンインストーラ用に同じコードを記述することを避けられます。2つの !insertmacros は2つの関数を挿入します。ひとつは、MyFunc という名前のインストーラ用の関数で、もうひとつは un.MyFunc という名前のアンインストーラ用の関数です。両方ともまったく同じ処理を実行します。

より詳しい情報については、 コンパイル時のコマンド を参照してください。

2.4 コンパイラ

[原文]

スクリプトを作成した後は、スクリプトをコンパイルする必要があります。MakeNSIS.exe は NSIS コンパイラです。コンパイラはスクリプトを読み込んで、構文を解析し、インストーラを生成します。

スクリプトをコンパイルするには、作成した .nsi ファイルを右クリックして「NSISスクリプトをコンパイル」を選択します。NSIS コンパイラのインタフェースである MakeNSISW が起動され、スクリプトをコンパイルするために MakeNSIS が呼び出されます。MakeNSISW は MakeNSIS の出力を取得して、画面に表示します。画面では、出力結果を確認したり、出力結果をコピーしたり、インストーラをテストしたり、インストーラをブラウズしたりすることが可能です。コマンドプロンプトから makensis.exe を実行することも可能です。

コンパイラはスクリプトをチェックして、警告やエラーを表示します。エラーが発生した場合は(例: 引数が2つ必要なのに1つしかない)、コンパイラは処理を中断し、行番号を含む短いエラーメッセージを表示します。致命的でないエラーに対しては、コンパイラは警告を表示します(例: 1つのスクリプトに2つの DirText コマンド)。スクリプトにエラーがない場合は、配布用のインストーラを出力します。

ここ で説明しているように、NSIS は異なる圧縮方式をサポートしています。ZLIB はデフォルトの圧縮方式です。高速でメモリ消費が少ないという特徴があります。また、LZMA はインターネットでの配布など、小さなインストーラを作成するのに適した方式です。BZIP2 は、通常は ZLIB よりも高い圧縮率が得られますが、LZMA ほどの性能は得られません。メモリ使用を抑えたい場合や、高速にスクリプトをコンパイルしたい場合に有効です。

Linux や BSD、Mac OS X サーバで Windows インストーラをコンパイルすることも可能です。詳細については、 NSISの構築 を参照してください。

2.5 モダンユーザインターフェース

[原文]

NSIS の一般的なユーザインターフェースは、「モダンユーザインターフェース」です。最近の Windows バージョンにおけるウィザードのようなインターフェースです。モダンユーザインターフェースは、リソースファイルがカスタマイズされているだけでなく、多くの新しいインターフェースを持っています。現在のステップを説明する白いヘッダや、コンポーネントページにおける説明エリア、ウェルカムページ、アプリケーションの起動やシステムのリブートを選択する完了ページなどです。

その他の情報については、 Modern UI 2 ReadmeModern UI Examples を確認してください。

2.6 プラグイン

[原文]

NSIS は、スクリプト内から呼び出しが可能なプラグインをサポートしています。プラグインは C、C++、Delphiやその他のプログラミング言語で記述される DLL ファイルです。プラグインは、NSIS に対してより強力なコードを提供します。

プラグインの呼び出しは以下のようです。

DLLName::FunctionName "parameter number 1" "parameter number 2" "parameter number 3"

プラグイン関数の呼び出しの際に必要となる引数は、関数によって様々です。ある関数は引数が必要ないかもしれませんし、ある関数は多くの引数を必要とするかもしれません。例を示します。

nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP'
InstallOptions::dialog "$PLUGINSDIR\test.ini"
NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0

NSIS が認識しているプラグインはコンパイラ出力の最初に表示されています。NSIS は、 NSIS ディレクトリの下の Plugins フォルダ を探索して、利用可能な関数を一覧表示します。!addplugindir を使って、他のディレクトリも探索するよう NSIS に指示することも可能です。

NSIS には、最初から多くのプラグインが含まれています。NSIS Page コマンド( Pages を参照)と組み合わせてカスタムページを作成する InstallOptions は人気のあるプラグインです。Startmenu プラグインは、ユーザにスタートメニューのフォルダを選択させるページを提供します。様々な目的のための多くのプラグインがあります。Docs フォルダ のヘルプやサンプルを参照してください。NSIS Wiki でも、他のプラグインを見つけることができます。

プラグインを自分自身で作成することも可能です。C/C++ および Delphi のヘッダファイルが利用できます。作成方法については サンプルプラグイン を参照してください。NSIS のプラグインのソースコードも、ソースコードパッケージに含まれています。

2.7 より詳しい理解のために

[原文]

このチュートリアルでは、NSIS の基本的な機能を説明しました。NSIS ができるすべてのことについて詳しく知りたいなら、時間をかけてこのマニュアルを読んでください。

前へ | 目次 | 次へ


SourceForge Logo

« 1. Introduction to NSIS - NSIS Users Manual | トップページ | 3. Command Line Usage - NSIS Users Manual »

技術文書」カテゴリの記事