【需求】
即将迎来2017的除夕夜,公司刚发布的是一个小的版本,在这个版本中我的工作是:用InstallShield制作新的安装包。
为什么变更重新制作安装包的方式?是之前用XX插件(没去了解)做的安装包经常会被杀毒软件报病毒。
【初尝InstallShield】
原来也玩的做过安装包,用vs自带的工具去制作,在vs2013下,已经没有提供部署工具了,不过可以下载安装,一样的用。
既然需求已经指明是IS(InstallShield)来制作,那就去看看。
早在上一个版本中,因为个人对这个感兴趣,使用InstallShield2013LimitedEdition,这是一个轻巧的嵌入vs使用的版本,因为可以免费试用,是“可视化界面”引导的方式,Next/Next以及网上初级的资料较多,还是很容易做出一个demo。
在这个版本中,想用之前自己做的demo,发现工程无法使用,试用期到了,注册一下可以永久使用,那就去注册吧。
注册界面中的“国籍”一项是ComboBox,没有数据,需要翻墙……
翻墙后发现给的序列号没有作用……
有破解工具/方法,没用……
网上说可以打电话给中国区的客服解决,告知已经对该版本已经不在维护……
给官方发邮件,来回两三封,还是推荐使用最新版本……
让我感慨一下这里,因为已有的demo,内心排斥新的版本,所以在怎么干掉试用期,花费了一段时间去……
【使用IS时遇到的事一:第三方软件打包】
如何将.NET Framework或者其他更多的第三方打包到安装包中,如果目标机器没有,自动安装,且安装的版本与电脑位数一样?
这是一个系列问题。
1.在IS中,提供了一大部分可供打包的第三方文件列表,以.prq文件的方式提供,在列表中勾选下载,便下载到你的本地IS路径SetupPrerequisites文件夹中。(.prq是个xml一样,里面记录了下载的地址路径等信息)
2.如果你需要的第三方软件不在此列表中,寻找该软件的.prq文件,放在SetupPrerequisites文件夹中,刷新IS的该列表即可。
3.在列表中勾选,且每个右键/属性都设置为从安装包中提取使用。
4.在生成安装包的时候,也设置为从安装包中提取软件。
这里就体现了IS的强大,安装包运行时,目标机器如果没有你勾选打包进去的第三方软件,会自动安装。且如果是x86的电脑,会安装x86的第三方软件,否则安装x64第三方软件,前提是该第三方软件的x86和x64版本都打包进去了。
【使用IS时遇到的事二:安装界面】
当我看到IS的logo,用IS做出一个安装包时,我才明白小时候玩的游戏和一些软件的安装包是用IS做的。
IS制作的安装包界面可以选择需要的Dialogs,也提供了一些theme,但是主体布局结构逃不开左右双栏结构。我替换素材,修改文字后,界面是美观了一点,但是还是无法忍受这种布局,且最不能让我忍受的是,每一个界面中有“InstallShield”的字样无法去掉。理解,但不愿意接受。
工期还有一段时间,我问Frank
Frank,为什么要用IS来做安装包,丑爆了。
因为强大,可以满足我们的需求。
我们的需求很简单。
如果可以满足我们的需求,当然是越漂亮越好了。
【我对打包的理解】
当我用IS做出一个可以用于发布的安装包时,对打包有了一个系统的理解。
打包就是将vs下realease模式运行的文件加密后迁移至目标机器,且正常运行,在署个名。
填写基本信息
a.软件名称
b.公司名称
c.软件版本号
d.安装包、应用程序和卸载程序的icon
软件文件
程序集、config、数据库……
部署软件运行环境
.NET Framework、数据库
其他(Core)
软件安装默认的路径
软件安装目录的结构
安装时候美丽的界面
创建桌面与任务栏的快捷方式
软件是否可以重复安装
软件是否可以在运行的时候卸载
软件卸载的是否干净
软件需要的第三方软件是怎么安装给用户
……
前三步是必须的,总结为:某人的某物在各种环境下可以正常运行。
第四步并不是必须的,但是软件与软件的安装包用户体验就差距在了这里。
【尝试Inno Setup】
在网上查找,别人的安装包是怎么做的?惊讶的发现,360、腾讯管家、PPTV等很多软件的安装界面风格很相似,尤其是有道云笔记、网易云音乐和QQ音乐,是一个有颜色的矩形,上面写点字,下面有简单的选项,安装过程是轮播图片。
Inno Setup也支持可视化的界面制作,制作步骤比IS简单多了,但相对功能也简单多了。采取脚本的方式制作,找到了一个成熟软件的安装包,本着”有轮子就不造轮子”的思想,尝试改改。支持pascal语言,用C#的底子尝试去改,变量名放前面,类型放后面,Boolean和vb一样,写方法签名是function和js一样(能看到“语言是共通的”影子,也让我坚定,要把C#精通才是目标。)
两天的时间,居然真的该成功了。我在里面加入了一些自己需要的功能,核心是:
- 打包.NET Framework,如果目标机器没有,运行安装包中.NET Framework的安装包。
- 打包SqlCe,如果目标机器没有,是x86运行安装包中x86版本SqlCe安装包,是x64运行安装包中x64版本SqlCe安装包。
- 打包VC++,如果目标机器没有,运行安装包中的VC++安装包。
由此感慨为什么程序猿喜欢开源。因为开源,资料多一点,因为开源,可以自己定义。IS固然强大,但也是在故步自封。
还有一点:自己做的东西,一定要自己看得过去才行。
【使用Inno Setup遇到的事】
在打包VC++组件的时候,我也想让它像我打包的.NET Framework一样,检测目标机器没有,运行VC++的安装包,但是发现VC++不同于.NET Framework和数据库,在XP SP2、XP SP3、Win7中注册表的GUID各不相同,没有办法根据注册表判断。
那不管用户有没有,都去尝试去安装,这总不会有大问题…,但带来的负面效果就是,用户有了,还会弹出VC++的Windows Installer的界面,显示要修复还是卸载,多一个没有用的界面,总是让人不爽。
有一种叫"静默安装"的方式,即不会显示安装过程,有就不安装了,没有就【偷偷的】给用户安装。但是VC++2012_x86版本给xp的目标机器上静默安装后,会自动重启目标机器,这就更让我恼火了,换成vc++2010的不会重启,但是10不足以支持我们的需求。
直接将vc++的dll放到主程序文件夹中,当做软件的一部分,也不去单独安装,以这样的方式解决。
”静默安装”,哦,原来安装完一些软件,会推荐安装一些软件,有良心的呢,推荐安装的软件前面有个勾选,流氓的呢,在你不知情下就偷偷在安装了,连托盘的提示都没有。在这个版本中我还知道了有“静默升级”这个词,既有新版本发布,用户登录旧的版本会自动升级。
【尾声】
当我内心觉得骄傲时候,遇到了冷水,在这里总结,和诸位共勉:
打包了6个无用的文件,xml、pak、ico
xml文件一般是代码注释的文件,像数据库、ORM等都会有,不用打包进去。
ico制作安装包的时候选好就可以了,没有必要放在安装包里面中。
安装过程中操作/提示增多
目标机器没有安装.NET Framework,会先弹出一个仅含有"确定"的mbx提示:我们将引导您……
目标机器没有安装数据库,会先弹出一个仅含有"确定"的mbx提示:我们将引导您安装……
第三方软件安装与主程序安装相对独立
之前的版本是用压缩包制作的安装包,检测到目标机器没有.NET Framework和数据库后,分别点同意协议和确定,然后.NET Framework、数据库和主程序三个软件会共享一个进度条进行安装。
现在的版本是检测到目标机器没有.NET Framework,提示引导安装后,提取安装包中打包进去的.NET Framework安装包运行,是原生的安装过程。
安装成功后,紧接着自动检测目标机器是否有数据库,当目标机器中没有数据库,提示引导安装后,提取安装包中打包进去的数据库安装包运行,是原生的安装过程。
安装成功后,紧接着安装主程序软件。
虽然是运行的一个安装包,但过程中展现的是三个独立的安装过程,三个进度条,会给用户造成一种错觉:我安装你的软件,你给我安装了些什么乱七八糟的。
卸载不干净
软件使用过程中产生的一些文件在软件卸载的时候没有删掉。
可以覆盖安装
软件已经安装好,可以直接再次安装覆盖,没有像Windows Installer一样,有一个修复/卸载的界面。
可以在运行时卸载
会删掉一大部分文件,但是运行时用到的一些文件存留。
默认安装在D盘更好
如果检测目标机器有D盘,将软件安装在D盘,即使用户重装系统也没事。
当双屏的用户运行安装包,出现两个安装首页,其中一个还带有Windows边框
...
但还是有做的好的地方
安装过程漂亮多了
安装目录/任务栏的文件夹是中文名称
感悟:没有一个功能是一个版本造就十全十美的。