远程自动升级的实现
本节的内容可以参考CaseStudy目录下的文件:远程更新.Table
我们知道,B/S结构的软件易于部署,而C/S结构的软件则能提供更好的交互性。
虽然鱼和熊掌不可兼得,不过Foxtable却较好地融合了二者的优势。
作为C/S结构的软件,FoxTable有着良好的交互性,能充分利用客户端的计算能力,提供更好的性能和功能。
同时FoxTable内置远程升级功能,当项目有新的版本时,你只需简单的一行代码,即可同步更新所有客户端的项目。
需要注意的是: 试用版不具备本功能,只有商业版和开发版才能实现远程自动升级。
设计步骤:
1、项目属性中有两项用于设置远程升级:
- 在线升级路径
指定远程升级包的下载路径。
- 项目发布日期
指定项目的发布日期,此日期将用于和远程升级包的发布日期进行比较,以判断当前项目是否需要升级。
2、制作升级包
首先需要注意的是,升级包必须是zip格式的压缩文件。
当开发者准备发布项目的新版本时,首先应该将项目属性中的项目发布日期设置为当天日期,然后将需要更新的文件压缩成一个zip文件作为升级包使用,升级包的文件名为:update.zip,
升级包中的各文件必须保持原有的相对路径,项目文件位于压缩文件的根目录,而Images、Attachments则作为子目录,不过Catch目录没有必要包括在升级包中,因为它会自动生成。
如果需要的话,可以只将更改过的文件包括在升级包中。
然后新建一个名为update.txt的文本文件,该文本文件的内容为压缩包的发布日期,此日期必须和项目属性中设置的项目发布日期相同,通常就是当天日期。
最后将update.zip和update.txt文件上传到项目属性中指定的在线升级路径中。
即使你没有发布新的项目,也应该在在线升级路径放置一个包含项目发布日期的update.txt文件,以免用户在线升级的时候出现错误提示。
如果你对于制作升级包还有疑惑,可以参考我们为示例文件“远程更新.Table”制作的远程升级包,地址为:
http://www.foxtable.com/download/80211/update.zip
http://www.foxtable.com/download/80211/update.txt
需要注意的是,经常有用户制作升级包的时候,将整个项目文件夹压缩进去,这样是不对的,会导致升级失败。
我们需要将项目文件夹下的文件及其子目录压缩到升级包中,而不是直接将整个项目文件夹压缩到升级包中,这一点要特别注意:
3、在线升级
你可以在你的项目中加上一个在线升级的菜单命令或者按钮,代码很简单:
Syscmd.Project.Update()
执行上面的代码,系统首先检索远程升级路径中的update.txt文件,获得升级包的发布日期,然后用这个日期和本地项目的发布日期进行比较,如果升级包的日期较新,则下载update.zip文件,并自动解压更新有关文件。
至此我们的在线升级功能已经完成,即使你是一个初次接触编程的人,应该也能即时掌握。
Update的语法:
Syscmd.Project.Update(Prom1, Prom2)
Prom1: 可选参数,逻辑型,没有发现新版本时,是否提示用户。
Prom2: 可选参数,逻辑型,发现新版本时,是否提示用户升级。
例如希望自动升级能够完全"静默",发现新版本时不提示,自动开始升级,没有发现新版本时也不提示:
Syscmd.Project.Update(False,False)
如果我们在AfterOpenProject下面的代码:
Syscmd.Project.Update(False,False)
Forms("窗口1").Open() '可能会出错
目的是希望打开项目的时候自动升级,然后打开窗口1。
但是上述代码肯定会在升级成功之后提示错误,因为一旦升级成功,Foxtable就会关闭,后面的打开窗口代码就会出错。
我们可以用下面的代码避免错误:
If Syscmd.Project.Update(False,False) = False Then '如果没有升级
Forms("窗口1").open()
End If
也就是说Update执行后会返回一个逻辑值,如果升级成功,返回True,否则返回False。
4、基于局域网的在线升级
在线升级默认是基于互联网的,在升级之前,会自动检测是否连接互联网。
如果要基于局域网进行在线升级,除了将升级包路径设置为局域网路径外,还必须将属性“通过互联网升级”设置为False:
5、和远程升级相关的系统变量
- PublishDate
日期型变量,返回在项目属性中设置的项目发布日期。
- UpdatePath
字符型,用于设置或返回在线升级路径,有了这个变量,我们可以动态设置升级路径。
- RemoteUpdate
逻辑型,是否通过互联网升级。