登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星色的云

喜欢看星星,喜欢看看夜幕将至群星点缀的深蓝色天空

 
 
 

日志

 
 

用Delphi制作BPL包  

2010-10-10 11:44:16|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

背景

GCM3构造时间长的问题由来已久。伴随着时间的流逝,系统功能越来越强大,模块越来越多,目前仅GCM一项,需要编译的客户端dll389个之多。在编译机上,一次完整的编译过程(GCM+GCC_PE)耗时更是长达100分钟。经常出现这样的情况:开发人员和测试人员并没有别的事情,就是在等待编译版本,比如发版前的完整构造,或者每日构造失败需要重新编译,这就浪费了我们很多宝贵的工作时间。

解决方案

GCM3构造过程的环节很多,主要包括源码下载、编译、数据库模板和升级脚本的生成、文件压缩和打包发布等。其中编译是一个重头,占到一半以上的时间。其中每个工程编译时间大约为78秒,这样仅GCM的客户端dll编译就需要4050分钟时间。于是如何减少编译时间成为减少总构造时间的一个解决思路。

由于GCM本身框架结构比较庞大,模块里的类继承层次也比较多,很多重复性的代码都被提取出来放在基类中,但在编译过程中这些基类中的代码将会被不断的重复编译。比如有200个工程中的主窗体继承自基类TListDetailForm,该类定义于单元文件ListDetailFrm.pas中,那么在编译过程中ListDetailFrm.pas将被重复编译200次。同样,由于GCM框架结构中继承关系为:TListDetailForm -> TDataBaseForm -> TBaseForm -> TBlankForm,因此这些基类所在的单元文件都会被重复编译200次。

为了避免这种无谓的重复编译,我们可以把公共代码(包括基类所在单元以及一些公共单元)编译成一个独立的部分,其它的工程都引用它。这样公共部分的代码就只需要编译一次,大大减少了编译的时间。

Delphi提供了带包编译(Build with runtime packages)的机制来避免重复编译相同的源码,方法如下:在编译工程时勾选带包编译方式(位于Project -> Options… -> Packages ->Runtime packages),并把前面编译好的BPL添加到运行时包中。当然,这里的BPL就是包含公共代码的包。

这种做法优点:

1.         提高FinalBuilder编译速度,缩短编译时间。同时也提高了打包的速度;

2.         减小编译出来的文件(如exedll文件)大小,同时减小了安装程序的大小,顺便提高了安装速度;

3.         若基类或公共单元做了修改,某些情况下,可以避免所有模块重编一遍,只需把这个包重新编一下即可。

实际做法

基本上,GCM的基类和公共单元都位于SHARE\Common以及3编码阶段\3.1SOURCE\_Common两个目录下。我们创建了一个运行期包GCMCommonPackage.bpl,把这两个目录下的单元文件(*.pas)基本上都打入了包里。编译其它工程时,都引用这个运行期包。

效果

采用上述编译改造策略后,对GCM项目进行一次全编译(GCM+GCC_PE),编译时间由原来的1小时40分左右减少为1个小时左右,减小了约40%的时间。提取BPL以前,编译每个模块平均需要7——8秒钟。提取以后的时间减少到3——6秒。用ASPack压缩后,每个dll由原来的200——300K减小到了60——70K,平均大小减小了70%左右。另外安装时间也缩短了一些。

目前存在的问题

由于编译和构造本身的复杂性以及GCM各模块之间存在一些比较特殊的千丝万缕的联系,改为带包编译以后还存在。例如客户端dll必须加编译选项“dllmode”,而服务器端COM以及其它exe文件不能加“dllmode”编译选项,这样GCMCommonPackage.bpl就不能满足所有工程。另由于隐式包含,一些非公共的单元也被包含到包里了,可能会带来一定的隐患,参见稍后的详述。


"+userLink+""; $('miniAd').show(); } }, onFailure: function(){} }}); } showMiniAd();
  评论这张
 
阅读(2488)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018