用 NSIS 製作軟體安裝程式


Last Update : 12 / 19 / 2007 By DarkRanger .


前言

安裝 NSIS 與開發環境

開始 script 撰寫

編譯與執行

參考網站




前言


安裝程式(Installer)的用處與重要性相信不需要 DR 再多加說明了,NSIS(Nullsoft Scriptable Install System)是一套 Windows 平台的安裝程式製作工具,它具有高自訂性、可程式化(scriptable)等等的優點。而且 NSIS 是開放原始碼且完全免費,任何個人、團體都可以利用它來發佈自己的軟體程式。

NSIS 的功能非常強大,不過這篇文章只示範了幾個基本的需求:

(1) 製作一個圖形介面的安裝程式,可自動建立指定的目錄並安裝檔案。

(2) 製作反安裝程式(Uninstaller),可將所有軟體檔案自動刪除。

(3) 新增開始功能表(start menu)的選項。

至於比較非基本的,例如『新增移除』(Add/Remove)或是系統環境的偵測則不在本文的範例之內。而接下來的第一步就是先把 NSIS 裝起來:

安裝 NSIS 與開發環境

請至官方網站:http://nsis.sourceforge.net 下載最新的版本並安裝。NSIS 的開發方式是撰寫一支副檔名為 *.nsi 的 script file,然後將 script 送進編譯器(MakeNSISW)可以打包出安裝程式,所以其實只要用任一個文字編輯器撰寫 script 即可。然而使用 IDE(整合開發環境)來提供例如 syntax highlighting、自動呼叫編譯器等的功能卻一定方便得多,因此你可以在這個頁面搜尋合用的開發環境:http://nsis.sourceforge.net/Category:Development_Environments

DR 使用的是 HM NIS Edit,一樣下載之後直接安裝即可,它的外觀就如下圖:



開始 script 撰寫

執行 NIS Edit 後,就可以新增一支 script file,DR 建議將 script 放在所要打包的檔案目錄下,例如要打包的檔案在 C:\project 目錄裡,就把 script 存放在 C:\project,這樣在寫入檔案時比較不需要注意路徑方面的問題。

所以也請讀者注意,以下的路徑都是以 script 和欲打包軟體放在相同目錄的狀況下。

再來就是 script 的寫作範例了,在此提醒一下: NSIS 的 script 註解用『#』『/* */』都可以。

# 首先 include Modern UI,它可以讓整個安裝程式的外觀變得漂亮許多:

  !include "MUI.nsh"

# 再來示範自定常數的定義方式,以軟體名稱與版本為範例:

  !define NAME "DR's Program"
  !define VERSION "1.0.0"

# 以下兩行分別是設定安裝程式的標題以及檔名:

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

# 此行非必要,增加後會在安裝過程顯示詳細的安裝訊息(預設要特別點選才會顯示):

  ShowInstDetails show

# 設定預設的安裝路徑(Program Files):

  InstallDir "$PROGRAMFILES\${NAME}"

# 以下是頁面的添加,不用特別設定就可以直接使用:

  !insertmacro MUI_PAGE_WELCOME
/* 歡迎頁面 */
  !insertmacro MUI_PAGE_LICENSE "license.txt" /* 版權說明頁面,可以指定文字擋  */
  !insertmacro MUI_PAGE_COMPONENTS /* 元件選擇頁面 */
  !insertmacro MUI_PAGE_DIRECTORY /* 路徑選擇頁面 */
  !insertmacro MUI_PAGE_INSTFILES /* 執行安裝頁面 */
  !insertmacro MUI_UNPAGE_CONFIRM /* 移除確認頁面 */
  !insertmacro MUI_UNPAGE_INSTFILES /* 執行移除頁面 */

# 再來是語言的設定,以英文為例:

  !insertmacro MUI_LANGUAGE "English"

# 繁體中文設定(NSIS 已經將基本的介面完整中文化了):

  !insertmacro MUI_LANGUAGE "TradChinese"

# 如果寫入不只一行的語言設定,則必須加入以下的函式讓安裝程式啟動時可以選擇語言:

  Function .onInit

    !insertmacro MUI_LANGDLL_DISPLAY

  FunctionEnd

# 以下開始安裝程序的設定:

  Section "${NAME}"

    SetOutPath "$INSTDIR" /* 將安裝路徑設為先前指定的路徑(這是可以在路徑選擇頁面調整的) */

    # 以下是檔案內容的設定範例:

    File "test.dll"
    File "dr_test_program.exe"
    File "license.txt"

    # 假設想要將 C:\project\image 底下的檔案安裝到 C:\Program Files\DR's Program\image,則必須進行以下的動作:

    CreateDirectory "$INSTDIR\image" /* 在安裝目錄底下建立一個 image 目錄 */
    SetOutPath "$INSTDIR\image" /* 將路徑切換至 image 目錄 */

    # 設定內容檔案:

    File "image\pp1.bmp"
    File "image\pp2.bmp"
    File "image\pp3.bmp"

    # 製作反安裝程式:

    WriteUninstaller "$INSTDIR\Uninstall.exe"

    # 新增開始功能表選單:
 
    SetOutPath "$INSTDIR" /* 切換回安裝目錄 */
    CreateDirectory "$SMPROGRAMS\${NAME}" /* 建立選單目錄 */
    CreateShortCut "$SMPROGRAMS\${NAME}\${NAME}.lnk" "$INSTDIR\dr_test_program.exe" /* 新增該軟體的捷徑 */
    CreateShortCut "$SMPROGRAMS\${NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" /* 新增反安裝捷徑 */

  SectionEnd

# 以下開始反安裝程序的設定:

  Section "un.Uninstaller Section"

    # 移除檔案:

    Delete "$INSTDIR\dr_test_program.exe"
    Delete "$INSTDIR\test.dll"
    Delete "$INSTDIR\Uninstall.exe"
    Delete "$INSTDIR\license.txt"
    Delete "$INSTDIR\image\pp1.bmp"
    Delete "$INSTDIR\image\pp2.bmp"
    Delete "$INSTDIR\image\pp3.bmp"

    # 移除目錄:

    RMDir "$INSTDIR\image"
    RMDir "$INSTDIR"

    # 移除開始功能表選單:
 
    Delete "$SMPROGRAMS\${NAME}\${NAME}.lnk"
    Delete "$SMPROGRAMS\${NAME}\Uninstall.lnk"
    RMDir "$SMPROGRAMS\${NAME}"

  SectionEnd

# 附註:NSIS 也可以在 Section 和 Function 中插入簡單的訊息視窗,例如:

  MessageBox MB_OK|MB_ICONINFORMATION "Hello World"

編譯與執行

如果是使用 NIS Edit 的話,在選單上就有編譯與執行的選項可用了,如果編譯錯誤也會列出錯誤訊息。


參考網站

http://nsis.sourceforge.net



Back to DarkRanger.no-ip.org