使用NSIS对WEB工程打包

前言

博主目前在一所小型公司上班,公司的业务比较传统,做的不是互联网项目。近来一段,公司需要发布产品,需要对目前的项目进行打包,博主是一个刚毕业的菜鸟,老大把这项任务给我的时候整个人都是蒙的。之前从来没有听说过打包,只是知道一个exe运行一下即可,深入了解之后,打包可不是一个简单的压缩和解压的过程,这篇文章和大家分享一下我的所得。

本篇不介绍nsis的简介及使用,在网上可以搜到一大堆,本篇写的比较基础,没有用到nsis美化插件等等。

打包需求分析

  1. 首先要将主要程序打包进去,这是我们的主要目的
  2. 程序打包后需要附带一些运行环境(中间件及数据库等等),比如我的程序中的tomcat及mysql
  3. 只是压缩和解压是不行的,用户不可能会自己去配置和启动我们的项目,所以需要我们在打包的时候要配置好我们的运行环境

在明白了自己打包的需求后,我们就要着手准备自己打包的对象了,我建议在做打包之前要自己模拟一遍打包的流程,这样你会清楚很多,一遍流程下来之后就大概明白了自己需要去做些什么。我个人在做打包之前是在一个本子上画的流程,下面贴出我的流程图。

使用NSIS对WEB工程打包_第1张图片

 打包对象

  1. 运行环境 tomcat8 + mysql5.7 + jdk1.8
  2. 主程序文件(***.war)
  3. sql脚本
  4. 运行脚本(***.bat等等,此处接下来的文章会讲到)

规划目录

以下贴出我的打包工程目录规划

使用NSIS对WEB工程打包_第2张图片

其中,NSIS目录为NSIS软件所在目录,language.nsi是编译脚本所需要的语言包,YourSoftwareLicence是软件须知

准备资源

首先我们要准备打包的资源,此处我准备的运行环境全都是绿色版免安装的,资源网上都能找到,如果你需要可以私信我我发给你。

Tomcat8

关于tomcat我想不用多说什么,其实就是一个端口号设置的问题,端口号设置在conf文件夹下,在我的打包程序中并没有去检测客户端机器端口号占用问题,只是去给他设置了一个值8081

MySQL5.7

数据库是我整打包以来遇到问题最多的一项,因为绿色版的mysql在安装后由于客户端机器不同,造成的问题也花样百出,大多是Access denied等问题,在探索了很多遍之后终于整理出了一个稳定版本的mysql(原谅我是个菜鸟。。。)

jdk1.8

这个我就不多说了,没什么改动

主程序文件

在我目前的规划中,我要发布的war包在打包之前是直接放入tomcat的webapp下的,你也可以修改tomcat的web.xml设置将要发布的程序包单独放置,这样会清楚一点。

SQL脚本

我这里指的sql脚本可不是从Navicat里面导出的脚本,这里需要的是建库脚本,建议使用powerdesigner等工具编写一个标准的建库脚本。  

编写打包脚本

在撤了这么多之后,终于要介绍我们的打包了,在这一步中最为重要的就是打包脚本了,我的定义里打包脚本分为两个:

  1. 在用户执行安装后所需要运行的可执行脚本(用来达到我们想要达到的目的)
  2. nsis打包脚本(用于nsis编辑器识别并“加工”出我们想要的可执行程序)

可执行脚本编写

可执行脚本说白了其实在我的工程中指的是.bat文件,为什么需要这个东西呢,因为上文我们说到单单解压我们的资源是不行的,比如说我们的开机自启(注册为服务模式)、导入数据库等等,这些操作一个解压过程是满足不了的,所以我暂时能想到的就是利用批处理命令(bat)来达到我的目的。

主要目标有以下几个:

1、可修改程序运行必要的配置文件

2、将mysql、tomcat注册为服务

3、设置开机自启

4、导入数据库操作

5、启动服务

6、卸载服务

以下贴出以上几个bat文件的编写

(1)修改配置文件.bat

@echo off
setlocal enabledelayedexpansion
chcp 936
cd /d %~dp0
set startDir=%cd%
cd ../
set mpath=%cd%

我的程序中有需要修改的配置,故用此bat文件来修改,你也可以用这种方法去修改别的配置文件

@echo 修改上传下载的地址
set wtusfile=%mpath%\apache-tomcat\webapps\tus_servlet\WEB-INF\web.xml
echo %wtuspath%
for %%i in ("%wtusfile%") do set wtusfile=%%~fi
echo.
set oldtuspath=wtuspath
echo.
set newtuspath=%mpath%\apache-tomcat\webapps\SIS_TBMS_SYS_V5.0\files\
for /f "delims=" %%i in ('type "%wtusfile%"') do (
set str=%%i
set "str=!str:%oldtuspath%=%newtuspath%!"
echo !str!>>%wtusfile%_tmp.txt
)
move "%wtusfile%"_tmp.txt "%wtusfile%"

 (2)安装服务.bat

@echo off
@echo 正在安装MySQL服务......
cd /d %~dp0
cd ../
echo %cd%
set startDir=%cd%
set myIni=%startDir%\mysql\my.ini
cd "%startDir%\mysql\bin"
%startDir%\mysql\bin\mysqld --install MySQLOfSIS "--defaults-file=%myIni%"
@echo MySQL服务安装成功
@echo ***************************************

//此处的MySQLOfSIS是你的服务名称,可以自定义

@echo 正在安装Tomcat服务......
set JAVA_HOME=%startDir%\jdk1.8.0_66
set JRE_HOME=%startDir%\jdk1.8.0_66\jre
set
echo %JRE_HOME%
echo %JAVA_HOME%
cd "%startDir%\apache-tomcat\bin"
service.bat install
@echo Tomcat服务安装成功
@echo ***************************************

 (3)服务开机自启.bat

@echo off
@echo .................................
@echo .................................
@echo Tomcat服务设置开机自启...
sc config Tomcat8 start= auto
net start Tomcat8
@echo Tomcat服务启动成功
@echo .................................
@echo .................................
@echo MySQL设置开机自启...
sc config MySQLofSIS start= auto
net start MySQLOfSIS
@echo MySQL服务启动成功
@echo .................................
@echo .................................

(4) 导入数据库.bat

@echo off
setlocal enabledelayedexpansion
chcp 936


@echo 正在导入数据库,此过程时间稍长,请稍后。。。。
cd /d %~dp0
cd ../
set startDir=%cd%

SET dbhost=localhost
SET dbuser=root
SET dbpassword=root
SET sqlpath=%startDir%\sql\***.sql

cd mysql\bin

mysql -h%dbhost% -u%dbuser% -p%dbpassword% < %sqlpath% --default-character-set=utf8

(5)启动平台.bat(如设置开机自启此脚本功能不大)

@echo off
title 运行平台 Ctrl+C键结束服务
@echo 正在启动运行平台...
cd /d %~dp0
set startDir=%cd%
echo %startDir%|findstr /ibe "[0-9a-z:\\\~\!\@\#\$\(\)\_\+\`\-\=\;\'\.\,]*">nul&&goto run||goto error

:error
echo 错误:不要把版本解压放在包含有中文、空格和特殊字符的目录!
pause
goto end

:run
@echo .
@echo ...小提示..................................................................
@echo .                                                                         .
@echo . 连接方式                                                                .
@echo . 浏览器地址:http://127.0.0.1                                      .                                                            .
@echo .                                                                         .
@echo ...........................................................................

cd "%startDir%\apache-tomcat\bin"
start /B startup.bat

:end

(6)卸载服务.bat

@echo off
@echo 正在卸载MySQL服务......
cd /d %~dp0
cd ../
set startDir=%cd%
set myIni=%cd%\mysql\my.ini
cd "%startDir%\mysql\bin"
net stop MySQLofSIS
%startDir%\mysql\bin\mysqld --remove MySQLOfSIS
@echo 卸载MySQL服务成功
@echo ***********************************
@echo 正在卸载tomcat服务
cd "%startDir%\apache-tomcat\bin"
service.bat remove
@echo 卸载tomcat服务成功
pause

 以上六个脚本也是我们需要打包的内容。

NSIS脚本编写

; 该脚本使用 HM VNISEdit 脚本编辑器向导产生

; 安装程序初始定义常量
!define PRODUCT_NAME "xxx系统"
!define PRODUCT_VERSION "5.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"

SetCompressor lzma

; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"

; MUI 预定义常量
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"

; 欢迎页面
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!insertmacro MUI_PAGE_WELCOME
; 许可协议页面
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "YourSoftwareLicence.txt"
; 安装目录选择页面
!define MUI_PAGE_HEADER_SUBTEXT "建议不要将程序安装到中文路径"
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH


; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES

; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"

; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "SISSetup.exe"
InstallDir "$PROGRAMFILES\tbms"
ShowInstDetails show
ShowUnInstDetails show
BrandingText " xxx技术股份有限公司"

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File /r "D:\package\bag\*.*"
  ExecWait "$INSTDIR/bin/修改配置文件.bat"
  ExecWait "$INSTDIR/bin/安装SIS服务.bat"
  ExecWait "$INSTDIR/bin/服务开机自启.bat"
  ExecWait "$INSTDIR/bin/导入数据库.bat"
SectionEnd

Section 添加快捷方式

  WriteIniStr "$DESKTOP\你的系统名.url" "InternetShortcut" "URL" "http://localhost:8081/***"

SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateDirectory "$SMPROGRAMS\xxx系统"
  CreateShortCut "$SMPROGRAMS\xxx系统\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\xxx系统\Uninstall.lnk" "$INSTDIR\uninst.exe"
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

/******************************
 *  以下是安装程序的卸载部分  *
 ******************************/

Section Uninstall
	ExecWait "$INSTDIR/bin/卸载服务.bat"
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  
  delete "$DESKTOP\你的系统名.url"

  Delete "$SMPROGRAMS\xxx系统\Uninstall.lnk"
  Delete "$SMPROGRAMS\xxx系统\Website.lnk"

  RMDir "$SMPROGRAMS\xxx系统"

  RMDir /r "$INSTDIR\sql"
  RMDir /r "$INSTDIR\mysql"
  RMDir /r "$INSTDIR\jdk1.8.0_66"
  RMDir /r "$INSTDIR\bin"
  RMDir /r "$INSTDIR\apache-tomcat"

  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

Function .onInit
InitPluginsDir
  ;创建互斥防止重复运行
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "WinSnap_installer") i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
    MessageBox MB_OK|MB_ICONEXCLAMATION "有一个安装向导已经运行!"
    Abort
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
  Abort
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
FunctionEnd

 以上的代码不难理解,你也可以用NSIS里的脚本向导来生成脚本,生成出来之后可以参考我的脚本来进行改造,点击编译即可在目录内生成你要的***.exe文件。

 


分割线

最初版做出来之后,老大觉得安装包有点大,毕竟没有做相应的简化,最后针对mysql及jdk进行简化,前后减去了大概400m左右,简化的教程网上也有,另外,看到这篇文章的朋友或大牛们若有任何好的建议麻烦您提出来,互相学习。如果需要我的整套开发文件夹私信我给你。

小弟写的博客不多,排版也不是很规整,各位大哥请指正哈...

 

 

你可能感兴趣的:(打包)