NSIS 脚本浅析

一直以来,B/S程序由于其结构的原因不能像安装WINDOWS程序那样使用setup来进行安装,一般都是由开发人员配置好WEB运行环境,再导入数据库(或者由WEB的安装程序完成此部分),这样一般来说够用了,再如果是不懂开发的人配置这些环境就麻烦了,如果能像安装WINDDOWS程序那样,一路回车法就能安装成功,那就更帅了。

前几天由于公司的项目需要,我小小的的研究了一下NSIS,为什么选它呢?因为它是使用脚本来定制安装程序的,非常灵活,就是要学习一下它的脚本语言,多看一些例子就会用了。

先说一下制作的原理,系统的环境是apache1.3, php5.1.4,mysql5。这几个其实都是不需要安装的,在window2000/xp下,直接配置成服务,并启动服务就行了。所以安装过程应该是分为

1.复制文件到指定目录.
2.配置apache和mysql.
3.把apache和mysql安装成服务并启动.

首先下载并安装NSIS,安装后可以到它的example目录下看一下有很多例子程序。右键点示例脚本选择Compile NSIS Script进行编译,在该目录下会生成一个.exe文件,就是生成的安装程序文件。
NSIS的脚本由一些类似PHP和汇编的语法指定组成,还可以定义函数,宏。每个脚本至少有一个Section,名字为Uninstall的以un.开头的Section被认为是卸载时使用的指令集。

下面是安装程序的全部脚本。
SetCompressor lzma
!include “MUI.nsh”

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP “E:\logo.bmp”
!define MUI_ABORTWARNING
!define APP_NAME “蓝桥OfficeSystem2.0”

!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_LANGUAGE “SimpChinese”

Name ${APP_NAME}
Icon “${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico”
UninstallIcon “${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico”
DirText “安装程序将安装 $(^Name) 在下列文件夹。$\r$\n$\r$\n要安装在不同文件夹,单击 [浏览] 并选择其他文件夹。”
InstallDir “C:\lqserver”
OutFile “setup.exe”

Section “setup”
SetOutPath $INSTDIR
File /r Apache
File /r mysql5
File /r officesystem2
File /r php-5.1.4
File /r config.js
File /r sc.exe
Call config
WriteUninstaller “uninstall.exe”
CreateDirectory “$INSTDIR\temp”
CreateDirectory “$SMPROGRAMS\${APP_NAME}”
CreateShortCut “$SMPROGRAMS\${APP_NAME}\启动${APP_NAME}.lnk” “http://localhost/”
CreateShortCut “$SMPROGRAMS\${APP_NAME}\卸载${APP_NAME}.lnk” “$INSTDIR\uninstall.exe”
SectionEnd

Section “Uninstall”
ExecWait “$INSTDIR\sc stop apache”
ExecWait “$INSTDIR\Apache\apache -k uninstall”
ExecWait “$INSTDIR\sc stop mysql”
ExecWait “$INSTDIR\mysql5\bin\mysqld-nt –remove mysql”
RMDir /r $INSTDIR
RMDir /r “$SMPROGRAMS\${APP_NAME}”
SectionEnd

Function config
ExecWait “cscript $INSTDIR\config.js $INSTDIR”
#先停止并禁用IIS服务
ExecWait “$INSTDIR\sc stop w3svc”
ExecWait “$INSTDIR\sc config w3svc start= disabled”
#安装apache和mysql服务
ExecWait “$INSTDIR\Apache\apache -k install”
ExecWait “$INSTDIR\sc start apache”
ExecWait “$INSTDIR\mysql5\bin\mysqld-nt –install mysql –defaults-file=$INSTDIR\mysql5\my.ini”
ExecWait “$INSTDIR\sc start mysql”
FunctionEnd

一些指令的解释
SetCompressor lzma 指定压缩方式
!define APP_NAME “蓝桥OfficeSystem2.0” 定义应用程序的名字以便后面使用。
!insertmacro MUI_PAGE_*
这些是安装程序的所有页面,包括欢迎界面,选择目录,安装文件,完成页面。

Name ${APP_NAME} 指定应用程序的名字,语法和PHP有些类似
Icon “${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico”
UninstallIcon “${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico”
指定安装程序和卸载程序的图标,$NSISDIR是NSIS的安装目录,不用修改。
InstallDir “C:\lqserver” 默认安装目录
OutFile “setup.exe” 输出的安装程序文件名称
下面的一个section就是主要的安装和配置指令

File /r 解压一个文件夹及下面所有的文件和子目录到安装位置

Call config 调用config函数,这个函数主要是修改配置文件的作用。
WriteUninstaller “uninstall.exe” 生成卸载程序
ExecWait 是执行程序并等待返回,这样可以防止外部程序的运行而影响到NSIS脚本的执行。比如在apache服务的停止的时候,如果服务没停止完,就进行删除文件的操作就会出错。

在修改apache和mysql配置文件的时候我采用了js脚本来完成。因为用NSIS来完成这个功能太吃力了,用JS脚本进行字符串替换还是比较简单的,主要是把一些目录修改为安装目录就可以了。

还有这里使用了sc.exe,这个程序是命令行下管理windows服务的程序,不是系统自带的,可以去microsoft下载,使用它先禁用iis服务,防止和apache发生冲突。另外使用sc启动和停止服务要比用net命令快的多。

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.