一直以来,B/S程序由于其结构的原因不能像安装WINDOWS程序那样使用setup来进行安装,一般都是由开发人员配置好WEB运行环境,再导入数据库(或者由WEB的安装程序完成此部分),这样一般来说够用了,再如果是不懂开发的人配置这些环境就麻烦了,如果能像安装WINDDOWS程序那样,一路回车法就能安装成功,那就更帅了。8 C* F5 ]+ ]) ]6 n 前几天由于公司的项目需要,我小小的的研究了一下NSIS,为什么选它呢?因为它是使用脚本来定制安装程序的,非常灵活,就是要学习一下它的脚本语言,多看一些例子就会用了。 9 w5 X1 c [" g1 J' ~) j先说一下制作的原理,系统的环境是apache1.3, php5.1.4,mysql5。这几个其实都是不需要安装的,在window2000/xp下,直接配置成服务,并启动服务就行了。所以安装过程应该是分为 + p: W4 a/ p; P# ~1.复制文件到指定目录.) O6 I/ o1 Q' b6 u% ^! R 2.配置apache和mysql. / F e: R) A& h3.把apache和mysql安装成服务并启动.7 F; D0 C! N$ o 首先下载并安装NSIS,安装后可以到它的example目录下看一下有很多例子程序。右键点示例脚本选择Compile NSIS Script进行编译,在该目录下会生成一个.exe文件,就是生成的安装程序文件。 1 T0 b" ~% N6 i6 b" W* JNSIS的脚本由一些类似PHP和汇编的语法指定组成,还可以定义函数,宏。每个脚本至少有一个Section,名字为Uninstall的以un.开头的Section被认为是卸载时使用的指令集。$ B5 j; V0 d6 a, U0 H 下面是安装程序的全部脚本。 5 _) \: i+ c6 \" N/ p/ B5 B) | 5 c& u' A5 d( P1 X. C
复制内容到剪贴板
代码:
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
( ~! K8 k( l [. Y! a/ T4 _1 L" e! I7 }3 p \1 B u) v+ B3 @( Q; `" Q% i 一些指定的解释 ' t2 `1 k% r c8 n1 v: i. `SetCompressor lzma 指定压缩方式) r0 ^: B3 ?2 T( K8 |& K, { !define APP_NAME "蓝桥OfficeSystem2.0" 定义应用程序的名字以便后面使用。 7 V% b1 v+ R& h6 G& Q& V+ E- ^! _!insertmacro MUI_PAGE_* , @8 Y' i9 _+ C. y& u3 [这些是安装程序的所有页面,包括欢迎界面,选择目录,安装文件,完成页面。2 }# R! o( e, _# q: I x , n. H L0 J8 I Name ${APP_NAME} 指定应用程序的名字,语法和PHP有些类似 / _& Q) m% M# ]. }1 fIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" " Q% p. x9 m2 H4 L8 a9 _7 v6 n) tUninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico"! B+ g# `/ B5 G" z7 m+ k$ t 指定安装程序和卸载程序的图标,$NSISDIR是NSIS的安装目录,不用修改。3 _0 h1 y2 D. v" h. y3 E9 y InstallDir "C:\lqserver" 默认安装目录 7 a) r5 U. t& cOutFile "setup.exe" 输出的安装程序文件名称" Z! k/ i q: B e2 T t 下面的一个section就是主要的安装和配置指令& d9 m9 g$ f; z% j% p$ x File /r 解压一个文件夹及下面所有的文件和子目录到安装位置4 K- f- G" @- W+ P Call config 调用config函数,这个函数主要是修改配置文件的作用。 1 |. y3 j) N, C3 pWriteUninstaller "uninstall.exe" 生成卸载程序$ {9 W- h B$ `5 X0 J- ^& g7 {; I ExecWait 是执行程序并等待返回,这样可以防止外部程序的运行而影响到NSIS脚本的执行。比如在apache服务的停止的时候,如果服务没停止完,就进行删除文件的操作就会出错。 1 K% k* D- Z5 @5 n% \在修改apache和mysql配置文件的时候我采用了js脚本来完成。因为用NSIS来完成这个功能太吃力了,用JS脚本进行字符串替换还是比较简单的,主要是把一些目录修改为安装目录就可以了。 1 V- `0 f2 j ~3 {: p$ x还有这里使用了sc.exe,这个程序是命令行下管理windows服务的程序,不是系统自带的,可以去microsoft下载,使用它先禁用iis服务,防止和apache发生冲突。另外使用sc启动和停止服务要比用net命令快的多。 |