因为有人一直问程序的更新方案如何解决,这里把自己用的一套方案给分享一下。
使用的是aardio自带的更新模组。
1、先看效果
2、更新包发布
-- 直接在主程序生成目录dist中,把需要的所有文件放在都这里,如下图
更新包发布,使用 范例 -> 编码 -> 升级包制作工具,直接制作升级包,注意配置好网址目录
生成的更新文件,将这些文件全部放入服务器目录
整个配置过程就完成了。
这时启动更新程序就有如下提示:
下面是更新程序的代码,仅供参考
import win.ui;
import win.ui.atom;
/*DSG{{*/
var winform = win.form(text="小肥羊自动更新工具演示";right=399;bottom=353;border="thin";max=false;min=false;mode="popup";sysmenu=false)
winform.add(
button={cls="button";text="退出";left=251;top=310;right=346;bottom=347;z=1};
button2={cls="button";text="启动程序";left=90;top=310;right=185;bottom=343;z=5};
plus={cls="plus";left=0;top=0;right=400;bottom=140;foreBottom=-80;foreRepeat="expand";foreground="\res\123.gif";z=2};
richedit={cls="richedit";left=0;top=138;right=400;bottom=241;clipch=1;multiline=1;vscroll=1;z=3};
tips={cls="static";left=28;top=247;right=375;bottom=300;color=8388608;transparent=1;z=4}
)
/*}}*/
var atom,hwnd/*冲突窗口的句柄,该函数会自动激活此窗口*/ = winform.atom("296E7EC1-C67F-4967-9488-4E56B78ACFFF");
if(!atom){
/*为窗口设置原子值可以避免一个程序重复运行多个实例*/
win.quitMessage(); return;
}
winform.button.oncommand = function(id,event){
winform.close();
}
import console;
import fsys.version;
import fsys;
import fsys.update.app;
import fsys.update.dlMgr;
var s_exe="";
var s_success=false;
s_url = "https://aardio.online/update/example/version.txt"
s_version = "0.0.0.1";
// 可以接受命令行参数,由调用的程序指定需要检测版本的主文件,如果没有,直接默认为0.0.0.1版,基本就是强制更新
var arg = _CMDLINE ? ..string.trim(_CMDLINE);
if (io.exist(arg)){
s_version = fsys.version.getInfo(arg).fileVersion;
}
//定义一个简单的删除主程序的函数
var del_main = function(){
if (io.exist(arg)){
return io.remove(arg)
}
return true;
}
//定义一个显示框的输出
var dis_info = function(title,str=""){
if str != ""{
winform.richedit.appendText(title + ": " + str + '\r\n');
}
}
//定义一个标题作为输出提示
var dis_info2 = function(title,str=""){
if str != ""{
winform.tips.text = (title + ": " + tostring(str) );
}
}
//定义基础的更新文件下载目录
down = fsys.update.dlMgr(s_url,"\down\",s_version)
fsys.delete("\down\")
down.startUpdate(1000)
down.onConfirmDownload =function(isUpdated,appVersion,latestVersion,description){
/*检测版本完成触发此函数,
@isUpdated参数表示是否更新,
@appVersion参数为当前版本,
@latestVersion参数为更新的版本号,
@description为更新说明
返回真继续下载更新文件
不指定此事件时默认返回@isUpdated参数*/
dis_info("需要更新",tostring( isUpdated))
dis_info("当前版本",appVersion)
dis_info("最新版本",latestVersion)
dis_info("更新说明",description)
return isUpdated;
}
down.onDownloadBegin = function(totalSize,fileTotal){
dis_info2("开始下载更新文件", ..fsys.formatSize(totalSize),fileTotal)
}
down.onDownloadFile = function(path,contentLength,fileSize){
dis_info2("正在下文件", path)
}
down.onChecksumBegin = function(total){
dis_info2("开始检验,文件总数", total)
}
down.onChecksum = function(count,total){
dis_info2("已校检文件", count)
}
down.onError = function(err,filename){
/*导致错误的文件路径或URL 该值可能为空*/
dis_info2("更新遇到错误:",err +"--" +filename )
}
down.onEnd = function(updater,saveDir,appDir,mainPath,updateFilesCount){
/*更新文件已准备就绪,
以下参数中的路径已经转换为绝对路径:
updater 执行文件更新的EXE路径
saveDir 下载升级包的存储目录
appDir 需要更新的应用程序目录
mainPath 此应用程序的启动EXE路径
updateFilesCount 更新的文件数*/
dis_info2("文件已下载完成,待更新文件数:", updateFilesCount)
/*
dis_info(updater," 执行文件更新的EXE路径 ")
dis_info(saveDir ,"下载升级包的存储目录 ")
dis_info(appDir," 需要更新的应用程序目录" )
dis_info(mainPath ,"此应用程序的启动EXE路径")
*/
s_exe = mainPath
app = fsys.update.app(saveDir,appDir,false,true);
if(del_main()!=true){
win.msgboxErr("文件被占用!更新失败!","更新出错")
return ;
}
win.delay(1000)
app.apply()
app.onCopyFile = function(path,count){
dis_info2("正在复制",path)
}
app.onEnd = function(success){
dis_info2("更新完成",app.updateInfo.version );
s_success = true;
}
app.onError = function(err,filename){
dis_info2("发生错误",filename)
}
}
winform.button2.oncommand = function(id,event){
if (s_success and s_exe !=""){
import process;
process.execute(s_exe)
winform.close()
}else{
win.msgbox("更新未完成","请稍候")
}
}
winform.show();
win.loopMessage();
return winform;
代码不是很完善,在此抛砖引玉,供大家提高!