准备
下面模块的版本,是实际使用的版本,可以不局限下面的具体版本,主要了解打包的过程。
- InstallShield2009
- apache-tomcat-6.0.41
- mysql-5.7.19-winx64
以上软件模块,都可以搜索到,具体地址就不提供了。
创建安装批处理文件
各个模块的目录结构如下:
对于Tomcat,它提供了【bin\service.bat】批处理,执行它可以创建Tomcat服务,例如:
echo 安装Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat install dvcs_tomcat
对于MySql稍微麻烦些,首先它依赖VS2013的分发库:
echo 安装VS2013发布库[MySql需要此库]
%homepath%\vcredist_x64_2013.exe
其次,需要修改MySql的my.ini文件的路径和一些设置,并拷贝到MySql的工作目录下。因为MySql有一个超时自动断开的连接的机制,为了保持其长时间连接,需要修改my.ini的设置:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
为了达到自动化修改my.ini的设置,设计了一个模板文件【my_template.ini】,并且通过开发了一个EXE【ModifyMySqlIniFile.exe】来修改其中的路径和一些参数,最后通过批处理命令把它保存到MySql的工作目录下,具体命令如下:
echo 生成My.ini
%homepath%\ModifyMySqlIniFile.exe %homepath%\mysql\my_template.ini %homepath%\mysql\mysql-5.7.19-winx64 > %homepath%\mysql\mysql-5.7.19-winx64\my.ini
安装MySql服务和启动服务的命令如下:
echo 安装MySql服务
%homepath%\mysql\mysql-5.7.19-winx64\bin\mysqld --install dvcs_mysql --defaults-file=%homepath%\mysql\mysql-5.7.19-winx64\my.ini
echo 启动MySql服务
net start dvcs_mysql
创建应用数据库时,由于需要支持批处理,发现MySql可以执行外部Sql文件,所以我先建立一个Sql文件【create_db.txt】,具体内容如下:
create database dvcs;
在安装的批处理【real_install.bat】里,执行创建应用数据库,具体命令如下:
echo 创建数据库[dvcs]
"%cd%\mysql\mysql-5.7.19-winx64\bin\mysql" -h localhost -uroot -p123456 < %homepath%\mysql\mysql-5.7.19-winx64\create_db.txt
至此,基本的模块都可以通过批处理命令执行了,完整安装的批处理如下:
@ echo off
::切换到工作目录
cd /d %~dp0
echo %cd%
set homepath="%cd%"
echo 安装VS2013发布库[MySql需要此库]
%homepath%\vcredist_x64_2013.exe
echo 生成My.ini
%homepath%\ModifyMySqlIniFile.exe %homepath%\mysql\my_template.ini %homepath%\mysql\mysql-5.7.19-winx64 > %homepath%\mysql\mysql-5.7.19-winx64\my.ini
echo 安装MySql服务
%homepath%\mysql\mysql-5.7.19-winx64\bin\mysqld --install dvcs_mysql --defaults-file=%homepath%\mysql\mysql-5.7.19-winx64\my.ini
echo 启动MySql服务
net start dvcs_mysql
echo 创建数据库[dvcs]
"%cd%\mysql\mysql-5.7.19-winx64\bin\mysql" -h localhost -uroot -p123456 < %homepath%\mysql\mysql-5.7.19-winx64\create_db.txt
echo 安装Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat install dvcs_tomcat
还有一个问题,因为后面需要部署应用,不能缺少环境变量,因此也需要创建一个批处理文件【set_sys_env.bat】以执行自动化创建环境变量,具体内容如下:
@echo off
::切换到工作目录
cd /d %~dp0
echo %cd%
echo 用户环境变量
setx DVCS_HOME "%cd%"
setx JRE_HOME "%cd%\jdk1.8.0_131\jre"
setx CATALINA_HOME "%cd%\tomcat\apache-tomcat-6.0.41"
setx MYSQL_HOME "%cd%\mysql\mysql-5.7.19-winx64"
echo 系统环境变量
set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set envname=DVCS_HOME
set envpath="%cd%"
reg add "%regpath%" /v %envname% /d %envpath% /f
set envname=JRE_HOME
set envpath="%cd%\jdk1.8.0_131\jre"
reg add "%regpath%" /v %envname% /d %envpath% /f
set envname=CATALINA_HOME
set envpath="%cd%\tomcat\apache-tomcat-6.0.41"
reg add "%regpath%" /v %envname% /d %envpath% /f
set envname=MYSQL_HOME
set envpath="%cd%\mysql\mysql-5.7.19-winx64"
reg add "%regpath%" /v %envname% /d %envpath% /f
并且为了保存安装时日志,安装和设置运行环境的批处理外层再封装一个批处理【install.bat】,将控制台输出重定向到文件里,具体内容如下:
@ echo off
::切换到工作目录
cd /d %~dp0
echo %cd%
::设置环境变量
call set_sys_env.bat
::调用安装批处理
call real_install.bat > install.log
至此,安装批处理创建完毕。
创建卸载批处理文件
卸载Tomcat很简单,卸载其服务即可:
echo 删除Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat remove dvcs_tomcat
卸载MySql稍微复杂些,不过参考安装的步骤,创建删除数据库的Sql文件【drop_db.txt】,具体内容如下:
drop database dvcs;
完整的卸载MySql的批处理【unstall_mysql.bat】内容如下:
set sqlhome="%MYSQL_HOME%"
echo 删除数据库[dvcs]
::%sqlhome%\bin\mysql -h localhost -uroot -p123456 < %sqlhome%\drop_db.txt
"%MYSQL_HOME%\bin\mysql.exe" -h localhost -uroot -p123456 < %sqlhome%\drop_db.txt
echo 停止MySql服务
net stop dvcs_mysql
echo 删除MySql服务
%sqlhome%\bin\mysqld --remove dvcs_mysql
删除环境变量的批处理【del_sys_env.bat】如下:
@echo off
echo 删除用户变量
set regpath=HKEY_CURRENT_USER\Environment
set envname=DVCS_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=JRE_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=CATALINA_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=MYSQL_HOME
reg delete "%regpath%" /v "%envname%" /f
echo 删除系统变量
set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set envname=DVCS_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=JRE_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=CATALINA_HOME
reg delete "%regpath%" /v "%envname%" /f
set envname=MYSQL_HOME
reg delete "%regpath%" /v "%envname%" /f
再在外面封装一个卸载批处理【unstall.bat】,具体如下:
@ echo off
::切换到工作目录
cd /d %~dp0
set homepath="%DVCS_HOME%"
echo 卸载MySql
call %homepath%\unstall_mysql.bat
echo 删除环境变量
call %homepath%\del_sys_env.bat
echo 删除Tomcat服务[Last]
%homepath%\tomcat\apache-tomcat-6.0.41\bin\service.bat remove dvcs_tomcat
至此卸载批处理也已创建完毕。
InstallShield打包
通过InstallShield打包,其实很简单,在主要的几个事件里调用安装和卸载的批处理即可,具体创建打包工程我就不多说了,因为这个视具体项目而定,我的打包工程类型为【InstallScript MSI Project】,不过需要注意的是运行环境在安装完成后需要重启计算机才有效,所以我在脚本里添加了重启计算机的命令。InstallShield的脚本如下:
//===========================================================================
//
// File Name: Setup.rul
//
// Description: Blank setup main script file
//
// Comments: Blank setup is an empty setup project. If you want to
// create a new project via. step-by step instructions use the
// Project Assistant.
//
//===========================================================================
// Included header files ----------------------------------------------------
#include "ifx.h"
// Note: In order to have your InstallScript function executed as a custom
// action by the Windows Installer, it must be prototyped as an
// entry-point function.
// The keyword export identifies MyFunction() as an entry-point function.
// The argument it accepts must be a handle to the Installer database.
/* export prototype MyFunction(HWND); */
//---------------------------------------------------------------------------
// OnFirstUIBefore
//
// The OnFirstUIBefore event is called by the framework when the setup is
// running in first install mode. By default this event displays UI allowing
// the end user to specify installation parameters.
//---------------------------------------------------------------------------
function OnFirstUIBefore()
NUMBER nResult, nSetupType, nvSize, nUser;
STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
STRING szLicenseFile;
BOOL bCustom, bIgnore1, bIgnore2;
begin
//SetTitle("Installation "+IFX_PRODUCT_NAME,0,BACKGROUNDCAPTION);
// TO DO: if you want to enable background, window title, and caption bar title
// SetTitle( @PRODUCT_NAME, 24, WHITE );
// SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );
// Enable( FULLWINDOWMODE );
// Enable( BACKGROUND );
// SetColor(BACKGROUND,RGB (0, 128, 128));
// Added in InstallShield 15 - Show an appropriate error message if
// -uninst is specified and the product is not installed.
if( REMOVEONLY ) then
Disable( DIALOGCACHE );
szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
SdSubstituteProductInfo( szMsg );
MessageBox( szMsg, SEVERE );
abort;
endif;
nSetupType = TYPICAL;
Dlg_SdWelcome:
szTitle = "";
szMsg = "";
nResult = SdWelcome(szTitle, szMsg);
if (nResult = BACK) goto Dlg_SdWelcome;
szTitle = "";
svName = "";
svCompany = "";
Dlg_SdRegisterUser:
szMsg = "";
szTitle = "";
nResult = SdRegisterUser( szTitle, szMsg, svName, svCompany );
if (nResult = BACK) goto Dlg_SdWelcome;
Dlg_SetupType:
Dlg_SdAskDestPath:
nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0);
if (nResult = BACK) goto Dlg_SdRegisterUser;
Dlg_SdFeatureTree:
szTitle = "";
szMsg = "";
if (nSetupType = CUSTOM) then
nResult = SdFeatureTree(szTitle, szMsg, INSTALLDIR, "", 2);
if (nResult = BACK) goto Dlg_SdAskDestPath;
endif;
Dlg_SQL:
nResult = OnSQLLogin( nResult );
if( nResult = BACK ) then
if (!bCustom) then
goto Dlg_SetupType;
else
goto Dlg_SdFeatureTree;
endif;
endif;
Dlg_ValueAddedServices:
nResult = OnFirstUIBeforeValueAddedServices( nResult );
if (nResult = BACK) goto Dlg_SQL;
Dlg_SdStartCopy:
szTitle = "";
szMsg = "";
nResult = SdStartCopy2( szTitle, szMsg );
if (nResult = BACK) then
goto Dlg_ValueAddedServices;
endif;
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );
// setup default status
Enable(STATUSEX);
return 0;
end;
//---------------------------------------------------------------------------
// OnMaintUIBefore
//
// The OnMaintUIBefore event is called by the framework when the setup is
// running in maintenance mode. By default this event displays UI that
// allows the end user to add or remove features, repair currently
// installed features or uninstall the application.
//---------------------------------------------------------------------------
function OnMaintUIBefore()
NUMBER nResult, nType;
STRING szTitle, szMsg, svDir, svResult, szCaption,szCmd,szDir;
begin
//SetTitle("Installation "+IFX_PRODUCT_NAME,0,BACKGROUNDCAPTION);
//加入终止进程函数
// TO DO: if you want to enable background, window title, and caption bar title
// SetTitle( @PRODUCT_NAME, 24, WHITE );
// SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION );
// SetColor(BACKGROUND,RGB (0, 128, 128));
// Enable( FULLWINDOWMODE );
// Enable( BACKGROUND );
Dlg_Start:
nType = REMOVEALL;
nResult = MessageBox( SdLoadString( IFX_MAINTUI_MSG ), MB_YESNO );
if (nResult != IDYES ) then
abort;
endif;
// 删除服务
szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\unstall.bat";
LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);
switch(nType)
case REMOVEALL:
ComponentRemoveAll();
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REMOVEALL ) );
case REPAIR:
ComponentReinstall();
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REPAIR ) );
case MODIFY:
// Added in IS 2009 - Set appropriate StatusEx static text.
SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_MODIFY ) );
endswitch;
// setup default status
SetStatusWindow(0, "");
Enable(STATUSEX);
StatusUpdate(ON, 100);
end;
//---------------------------------------------------------------------------
// OnMaintUIAfter
//
// The OnMaintUIAfter event called by the framework after the file transfer
// of the setup when the setup is running in maintenance mode. By default
// this event displays UI that informs the end user that the maintenance setup
// has been completed successfully.
//---------------------------------------------------------------------------
function OnMaintUIAfter()
STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2;
NUMBER bOpt1, bOpt2;
begin
Disable(STATUSEX);
if( REMOVEALLMODE ) then
szTitle = SdLoadString(IFX_SDFINISH_REMOVE_TITLE);
szMsg1 = SdLoadString(IFX_SDFINISH_REMOVE_MSG1);
DeleteProgramFolder(TARGETDIR+"DVCSRunPlatform");
DeleteProgramFolder(FOLDER_PROGRAMS+"DVCSRunPlatform");
else
szTitle = SdLoadString(IFX_SDFINISH_MAINT_TITLE);
szMsg1 = SdLoadString(IFX_SDFINISH_MAINT_MSG1);
endif;
bOpt1 = FALSE;
bOpt2 = FALSE;
if ( BATCH_INSTALL ) then
SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
else
SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );
endif;
/* if(REMOVEALLMODE) then
SdFinishReboot ( @IDS_Z_REBOOT_TITLE ,@IDS_Z_REBOOT_MESG , SYS_BOOTMACHINE , "" , 0 );
endif; */
end;
//---------------------------------------------------------------------------
// OnFirstUIAfter
//
// The OnFirstUIAfter event called by the framework after the file transfer
// of the setup when the setup is running in first install mode. By default
// this event displays UI that informs the end user that the setup has been
// completed successfully.
//---------------------------------------------------------------------------
function OnFirstUIAfter()
STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2,szFile;
NUMBER bOpt1, bOpt2,nResult;
begin
Disable(STATUSEX);
bOpt1 = FALSE;
bOpt2 = FALSE;
if ( BATCH_INSTALL ) then
SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
else
SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 );
endif;
SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 );
end;
//---------------------------------------------------------------------------
// OnInstallFilesActionAfter
//
// The InstallFilesActionAfter event is called just after the standard MSI
// action 'InstallFiles' is executed.
//---------------------------------------------------------------------------
function OnInstallFilesActionAfter()
STRING szDir;
STRING szCmd;
NUMBER ret;
begin
if( REMOVEALLMODE ) then
else
// 设置环境变量
/* szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\set_sys_env.bat";
LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);
*/
// 安装服务
szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\install.bat";
LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);
endif;
end;
//---------------------------------------------------------------------------
// OnResumeUIBefore
//
// The OnResumeUIBefore event is called when end user runs installation that
// is performing a resumed install. Usually this happens by specifying
// a property like REINSTALL or ADDLOCAL at the command line when the
// product is already installed. After this function returns,
// ComponentTransferData is called to perform file transfer.
//---------------------------------------------------------------------------
function OnResumeUIBefore()
int nResult;
string szTitle, szMsg ,szCmd;
begin
//加入终止覆盖函数函数
/*MessageBox("The installation has detected that DVCS Server has been installed. " +
"Please uninstall the DVCS Server, " + "then restart the installation process.", INFORMATION);
abort; */
Dlg_SdWelcome:
szTitle = SdLoadString(ISWI_RESUMEUI_TITLE);
szMsg = SdLoadString(ISWI_RESUMEUI_MSG);
nResult = SdWelcome(szTitle, szMsg);
// Added in IS 2009 - Set appropriate StatusEx static text.
szMsg = SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_UPDATEUI );
SdSubstituteProductInfo( szMsg );
SetStatusExStaticText( szMsg );
Enable(STATUSEX);
// 删除服务
szCmd = TARGETDIR ^ "\\DVCSRunPlatform\\unstall.bat";
LaunchAppAndWait(szCmd,"",LAAW_OPTION_WAIT|LAAW_OPTION_SHOW_HOURGLASS|LAAW_OPTION_HIDDEN);
end;
以上介绍了所有步骤,希望对大家有所帮助。下一篇,我将介绍怎样在已经部署好的Web运行环境下部署Web应用。