这里讲的是openexpressapp的部署方案。主要使用的是clickonce作为实施方案来实现:智能部署和智能客户端。不过,这里的使用方式跟以往的不太一样……
部署概述
openexpressapp中,界面是自动生成的。而框架使用者所开发的应用程序(以下简称客户程序),只需要按照特定的格式约定编写自己的业务逻辑模型类,然后与框架一同发布,就可以直接运行并显示出所有的界面了,这样就可以实现比较大粒度的重用。如图:
也就是说,当框架使用者使用本框架时,得到的是已经通过clickonce发布好的文件夹,里面有应用程序的.exe和.dll文件,而他们只能在library和module文件夹中添加他们自己编写的业务模型类库dll。这样,在开始运行后,框架会自动加载指定的dll并运行客户程序的业务逻辑。(上图中的module文件夹,也是类似功能,当框架使用者想扩展界面功能时,需要在这里放置自己的界面模块。)
虽然并不是所有的应用程序都适合使用这种模式,但是在一些并不要求界面灵活多变的windows程序中,这样大粒度的重用,确是提高开发效率的好方法。:)
其它问题
由于使用了clickonce来实现智能客户端,所以我们在每次发布框架的时候,都会直接对没有任何业务模型类库dll的程序进行发布。使用过clickonce的人就会知道,这样生成的文件夹中,会包含分别以.application和.manifest为扩展名的两个文件。文件中存储了所有发布的文件的清单和它们的的hash值(本来还会有签名的信息,不过目前在框架中并没有使用。),这样可以防止恶意篡改发布后的程序。
也就是说,框架使用者无法直接把自己编写的业务逻辑类dll,直接拷贝进文件夹中,同框架一起发布到iis来实现自动升级。
解决方案
图中红框处可以添加新的文件引用。在这个工具中,同样可以对application文件中的其它属性进行修改,如server的url等。
这样,虽然可以使程序成功发布,但是却无法实现“智能”。因为manifestmanagerutility虽然这次计算出新的hash值,并对.application文件进行更改。但是当框架使用者对客户程序再次进行更新时,由于hash值也会变化,所以客户端就无法获取到更新过的dll。这样还必须再重复一次上面修改.application文件的操作,才能正常发布,这样当然不能算“智能升级”。
所以我们提供了versionadd.exe控制台程序。当客户程序升级后,框架使用者把升级后的dll覆盖上个版本的dll,然后调用此exe实现更新,即可自动维护application文件清单并升级clickonce的版本。这些发布工作,只需要编写一个简单的脚本文件来完成就可以了。例如,我们现在正在开发的项目gix4,原来使用finalbuilder进行发布,现在换成了一个脚本文件,autobuild.bat。它的工作主要是实现:从服务器更新文件,编译,发布,邮件通知等……如:
…………其它脚本……………
rem 更新文件
………………
rem编译
rem 版本号增加
versionadd.exe -filename "d:\publish\intranet\openexpressapp.host.wpf.application"
rem 邮件通知所有测试人员
…………其它脚本…………
结束语
目前我们现在开发的gix4项目,由于使用了openexpressapp框架,所以它的部署工作正是使用了上面的方法实现的一键部署。这对于实施每日构建,提高开发和测试的效率有很大的帮助。
相关文章链接:
<a href="http://www.cnblogs.com/zhoujg/archive/2009/09/15/1567353.html" target="_blank">openexpressapp架构-一个信息系统的平台</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/10/10/1579743.html" target="_blank">订单示例</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/10/12/1582009.html" target="_blank">总体架构的由来</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/01/1593632.html" target="_blank">平台学习必备知识</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/10/19/1585773.html" target="_blank">代码目录说明</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/16/1603824.html" target="_blank">应用模型applicationmodel</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/12/1601599.html" target="_blank">内置支持的模块类型</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/10/16/1584323.html" target="_blank">内置支持的属性编辑方式</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/02/1594360.html" target="_blank">内置支持的列表编辑方式</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/05/1596482.html" target="_blank">理解核心元素objectview</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/11/1600687.html" target="_blank">autoui自动生成界面</a>
<a href="http://www.cnblogs.com/zhoujg/archive/2009/11/12/1602118.html" target="_blank">command扩展机制</a>