使用NSIS打包B/S程序全部代码

使用NSIS打包B/S程序全部代码

一直以来,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命令快的多。
posted @ 2011-07-20 16:43  jex  阅读(702)  评论(0编辑  收藏  举报