二、简单的NSIS安装包
新建脚本:向导
我们先从一个简单的NSIS安装包开始吧,就像前面(NSIS介绍)所说,我们虽然看过用户手册,可要写安装脚本无从下手,那我们的编辑工具HM NIS Edit就派上用场了。
打开HM NIS Edit,点击菜单“文件”->“新建脚本:向导”,会有向导一步步让我们输入信息,最后根据我们的输入生成.nsi脚本文件,下面我们一步步演示:
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show
Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite try
File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"
File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"
File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"
SetOutPath "$INSTDIR\Images"
File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"
File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"
File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"
SetOutPath "$INSTDIR\Scripts"
File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"
SetOutPath "$INSTDIR\SystemLog"
File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"
File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"
File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"
SetOutPath "$INSTDIR"
File "E:\ZZL\ADWeb\安装包制作\Release\Web.config"
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
Abort
FunctionEnd
Section Uninstall
Delete "$INSTDIR\uninst.exe"
Delete "$INSTDIR\Web.config"
Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"
Delete "$INSTDIR\SystemLog\SystemLogList.aspx"
Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"
Delete "$INSTDIR\Scripts\CommonScript.js"
Delete "$INSTDIR\Images\add.png"
Delete "$INSTDIR\Images\1_open.png"
Delete "$INSTDIR\Images\1_close.png"
Delete "$INSTDIR\Error.aspx"
Delete "$INSTDIR\Default.aspx"
Delete "$INSTDIR\404.aspx"
RMDir "$INSTDIR\SystemLog"
RMDir "$INSTDIR\Scripts"
RMDir "$INSTDIR\Images"
RMDir "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd
值得注意的是,从新建脚本向导的第三步有选项用户图形界面我们默认选择的是“现代”,对应脚本中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),对应的安装页面中都是以!insertmacro MUI_PAGE_***开头(如:欢迎页面!insertmacro MUI_PAGE_WELCOME),详细的说明请查看NSIS Modern User Interface。
安装包:现代界面
下面我们看下安装包的效果,在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:
从上面截图可以看到我们的安装包共有5个用户界面,这个和脚本文件中是对应的:
; Welcome page !insertmacro MUI_PAGE_WELCOME ; License page !insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt" ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page !insertmacro MUI_PAGE_FINISH
其中“安装记录页面”将实际执行安装区段中的指令,这些指令可以解压文件读取,读写注册表、INI文件或普通文件,执行Powershell脚本,创建目录,创建快捷方式等等。如果一个安装程序有多个组件,每个组件都有它自己的代码块,当用户选择了安装该组件,那么安装程序就会执行对应的代码,那么每个组件就需要对应一个区段,具体关于可选组件的信息会在以后章节介绍。我们目前只有一个安装区段,是把部署包文件放入安装目录:
Section "MainSection" SEC01 SetOutPath "$INSTDIR" SetOverwrite try File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx" SetOutPath "$INSTDIR\Images" File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png" File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png" File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png" Sleep 20000 SetOutPath "$INSTDIR\Scripts" File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js" SetOutPath "$INSTDIR\SystemLog" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx" SetOutPath "$INSTDIR" File "E:\ZZL\ADWeb\安装包制作\Release\Web.config" SectionEnd
关于界面上的信息都是我们在脚本向导中设置的(如应用程序名称、版本、公司、图标、授权信息、语言等),可以在脚本中修改:
; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "My application" !define PRODUCT_VERSION "1.0" !define PRODUCT_PUBLISHER "My company, Inc." !define PRODUCT_WEB_SITE "http://www.mycompany.com" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" ; MUI 1.67 compatible ------ !include "MUI.nsh" ; MUI Settings !define MUI_ABORTWARNING !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
还有一些是关于安装包本身的信息(如:名称、默认安装路径、生成安装包名称、是否显示安装详情等):
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir "$PROGRAMFILES\ADWebManager" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show ShowUnInstDetails show BrandingText " MyCompany Ltd."
其中注意加一行命令BrandingText " Prolliance Ltd.",这样用户安装界面中就不是NSIS的信息了,前后对比如下:
修改脚本:标准界面
上面我们使用HM NIS Edit的向导创建了具有“现代界面”的安装包,其中脚本文件中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),现在我们不要引入额外的头文件,改成NSIS标准的界面试试,就像我们查看用户手册看到的,我们可以通过Page命令(或更多高级设置如PageEx)。我们修改后的脚本文件如下:
; Script generated by the HM NIS Edit Script Wizard. ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "My application" !define PRODUCT_VERSION "1.0" !define PRODUCT_PUBLISHER "My company, Inc." !define PRODUCT_WEB_SITE "http://www.mycompany.com" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" ; pages PageEx license LicenseText "许可页面" LicenseData "E:\ZZL\ADWeb\安装包制作\Licence.txt" ;LicenseForceSelection PageExEnd PageEx directory DirText "目录选择页面" "目标文件夹" "浏览..." PageExEnd Page instfiles UninstPage uninstConfirm UninstPage instfiles ; MUI end ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "Setup.exe" InstallDir "$PROGRAMFILES\My application" ShowInstDetails show ShowUnInstDetails show BrandingText " MyCompany Ltd." Section "MainSection" SEC01 SetOutPath "$INSTDIR" SetOverwrite try File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx" SetOutPath "$INSTDIR\Images" File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png" File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png" File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png" Sleep 20000 SetOutPath "$INSTDIR\Scripts" File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js" SetOutPath "$INSTDIR\SystemLog" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx" File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx" SetOutPath "$INSTDIR" SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" SectionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。" FunctionEnd Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2 Abort FunctionEnd Section Uninstall Delete "$INSTDIR\uninst.exe" Delete "$INSTDIR\Web.config" Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx" Delete "$INSTDIR\SystemLog\SystemLogList.aspx" Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx" Delete "$INSTDIR\Scripts\CommonScript.js" Delete "$INSTDIR\Images\add.png" Delete "$INSTDIR\Images\1_open.png" Delete "$INSTDIR\Images\1_close.png" Delete "$INSTDIR\Error.aspx" Delete "$INSTDIR\Default.aspx" Delete "$INSTDIR\404.aspx" RMDir "$INSTDIR\SystemLog" RMDir "$INSTDIR\Scripts" RMDir "$INSTDIR\Images" RMDir "$INSTDIR" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" SetAutoClose true SectionEnd
安装包:标准界面
下面我们看下标准界面的脚本生成的安装包效果,执行后在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:
是不是比较起来“现代用户界面”,标准的界面会很丑,而且NSIS内置的标准安装界面没有欢迎、完成界面(只有许可、目录选择、组件、安装记录页面) ,另外“上一步”、“下一步”、“取消”等按钮需要额外的语言包文件来载入,不如“现代用户界面”只需要一个指令(!insertmacro MUI_LANGUAGE "SimpChinese")来指定采用的语言,所以接下来我们还是采用“现代用户界面”来制作安装包,当然这些界面上的图标,任何地方的文字都是可以定制的。
下面章节就以实际中的应用作为例子,然后由该例子展开来说明页面的定制、PowerShell命令的调用、SQL Server数据库的访问、Web应用程序的部署、失败的回滚和卸载程序的执行等等。