大家好我是juster,GeneralUpdate的开源项目作者。这次将发布GeneralUpdate里程碑版本,该版本发生了巨大改变历时4个月的时间终于要和大家见面了。开源不易希望大家能多多支持。可能或多或少会有些bug希望大家多多反馈,这里也有一个小小的心愿希望这个开源项目能上1000star,拜托各位小伙伴了。
- github:https://github.com/WELL-E/AutoUpdater
- gitee:https://gitee.com/Juster-zhu/GeneralUpdate
- 在线帮助文档:http://justerzhu.cn/ (后续将会按组件拆分成对应的文档)
- Nuget版本管理参考标准:https://docs.microsoft.com/zh-cn/nuget/concepts/package-versioning
- 应用程序集版本管理参考标准:https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/versioning (被组件更新的客户端程序,说通俗点就是你公司的产品;组件的操作将按照这个标准执行。)
- 本次版本发布会有很多改变,不是平滑升级(追求稳定或不想改动慎用)。本项目正在逐渐稳定后续将会平滑升级避免开发者再度修改。
- 如果发生“乌龙事件” 例如:发布更新包内容自身错误或更新过程中发生意外,不可回滚。目前解决方案(1)重新请求更新,(2)通过推送机制发送紧急修复版本更新包;来解决此类问题。
- 关于“不可回滚”这个问题,如果有更好的办法希望各位可以直接在issues中提出您的看法;目前社区中有两种声音(1)出现意外情况希望组件可以将本地程序回滚至原来的版本,保证哪怕更新失败也要用户可用。(2)更新组件的意义就是将组件推向新的版本让本次的版本发布有效,如果更新失败那么让它更新成功为止;只许前进不许退。
GeneralUpdate力致于支持多操作系统、多UI框架、多.NET框架版本达到“通用更新”。本开源项目有企业生产环境落地的实践作为支撑,并由本人及社区在持续做新特性的迭代、维护管理。接下来的内容相信大家都会感兴趣,我想到了很多有意思的想法这里会逐个分享给大家。
1.开发历程
本次发布版本是从2022年1月1日开始,重构、设计、开发、修复、编写文档GeneralUpdate到2022年3月22日。在这将近4个月的时间里几乎所有的休息时间都在做开源;有时候写到凌晨躺在床上因为写代码导致的大脑兴奋一直睡不着长期的睡眠不足导致凝血功能失常,依旧在项目中对迭代、设计和社区建议中做出努力。非常感谢社区的小伙伴的支持、建议和帮助,这里再次向.net社区发起招募希望可以有更多的小伙伴加入到开源中来。依旧保持之前所说的奖励机制(https://mp.weixin.qq.com/s/jP4T_M1pqpZ49g7cSs2rnw)或根据贡献难度分配给参加开源的开发者们。
补充:需提交功能性、重要修改PR(“蜻蜓点水”的PR不算在奖励分配的考虑范围内)、重要平台调研或测试工作。
特别感谢@Weihan Li 、@lindexi 、 @walterlv 以及@github参考的开源项目作者们(参考代码均为MIT协议不会发生其它协议混淆造成“代码感染”),在此期间的技术解答和参考的技术文章、代码。如果没有社区的小伙伴的支持GeneralUpdate将会很难进步。
2.开源建设
我的目前的想法如下,不知道合不合适。如果有任何想沟通交流的可以邮件联系我zhuzhen723723@outlook.com
- (1)捐赠10元,提供使用解答,在线文档。
- (2)捐赠100元,提供最新版本的GeneralUpdate简易设计文档、使用教学视频(文档将以邮件的方式发送至捐赠者的邮箱中)。
- (3)捐赠1000元,提供针对本组件的技术支持。
- 需要特别说明的是,在使用开源项目的过程中遇到的问题希望在github或gitee上提交issue或PR以方便大家在网络上搜索问题及解决方案,请勿单独私聊(在平台上提交issue或PR我这里都是有邮件通知的会第一时间进行回复和解答)。
- 所有的文档及视频教程将在版本发布后陆续补充(发布之日起一个自然月内补齐)。
以上所有的捐款将会透明公开、并用于开源项目的建设中。所有的捐赠者提供捐赠截图和个人邮箱(不公开)登记记录,并会在GeneralUpdate的readme.md中记录在捐赠墙上。另外会将提交PR的开发者记录在readme.md中记录在贡献墙。
捐赠通道目前考虑的是集中在gitee的捐赠功能当中,这样捐献的资金大家都看到见。(https://gitee.com/Juster-zhu/GeneralUpdate)
*这里,特别说明一下为什么会制定这样的捐赠规则。
- GeneralUpdate项目是基于MIT(https://baike.baidu.com/item/MIT许可证/6671281)协议开放的不会收取使用者(企业、个人)的任何费用;
- 在开源社区中所有的开源工作者都需要支持和鼓励,为保持开源项目的持续进行和避免没有其他开发者愿意参与开源。
- 有了社区的捐赠会带来更多的开发者加入到开源回馈给社区更好用的开源项目,这样的一个良性循环改善.NET开源社区的环境。(捐赠并非购买版权或服务,纯属捐赠者认可和支持)
有钱的捧个钱场,没钱的捧个star。并向各位致以最大的敬意。
3.发布内容
这里先看看发布的版本号以及这次大版本的更新发生了哪些改动(共8个部分)。
组件名称 | 版本号(old) | 版本号(new) | 状态 |
---|---|---|---|
GeneralUpdate.AspNetCore | 1.0.0 | 1.1.0 | 正常 |
GeneralUpdate.ClientCore | 1.1.2 | 2.3.6 | 正常 |
GeneralUpdate.Core | 3.6.10 | 4.10.12 | 正常 |
GeneralUpdate.Differential | - | 1.0.0 | 正常 |
GeneralUpdate.Common | 1.0.0 | - | 移除 |
【1】组件GeneralUpdate.AspNetCore
(1)[NEW] 添加了最新版本推送功能,VersionHub对象。主要解决临时需要推送紧急修复重大bug的版本。
代码语言:javascript复制var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IUpdateService, GeneralUpdateService>();
builder.Services.AddSignalR();
var app = builder.Build();
app.MapHub<VersionHub>("/versionhub");
app.Use(async (context, next) =>
{
var hubContext = context.RequestServices.GetRequiredService<IHubContext<VersionHub>>();
await CommonHubContextMethod((IHubContext)hubContext);
if (next != null)
{
await next.Invoke();
}
});
async Task CommonHubContextMethod(IHubContext context)
{
await context.Clients.All.SendAsync("clientMethod", "");
}
【2】组件GeneralUpdate.ClientCore
(1)[NEW] 在GeneralClientBootstrap中重载了配置方式,该方法简化为只需要传递远程服务器地址例如http://127.0.0.1 和更新程序名称即可,简化了开发者需要关心的参数组件内自动获取。
代码语言:javascript复制public GeneralClientBootstrap Config(string url, string appName = "AutoUpdate.Core");
(2)[NEW] 添加了最新版本接收推送功能,VersionHub对象。主要解决临时需要接收紧急修复重大bug的版本,可以在GetMessage回调函数中可添加更新操作。
代码语言:javascript复制VersionHub<string>.Instance.Subscribe($"{ baseUrl }/{ hubName }", "TESTNAME", new Action<string>(GetMessage));
【3】组件GeneralUpdate.Core
(1)[FIX] 修复下载中途断网,到达超时时间没有异常上抛问题。
(2)[REFACTOR] 重构多任务下载设计。
(3)[FIX] 修复FileUtil.Update32Or64Libs在某些情况下会抛出异常。
(4)[REFACTOR] 重构默认更新策略设计。
(5)[NEW] 添加了最新版本接收推送功能,VersionHub对象。主要解决临时需要接收紧急修复重大bug的版本。开发者可以在GetMessage回调函数中可添加更新操作。
代码语言:javascript复制VersionHub<string>.Instance.Subscribe($"{ baseUrl }/{ hubName }", "TESTNAME", new Action<string>(GetMessage));
(6)[NEW] 支持7z压缩包的解压功能。
(7)[REMOVE] 移除了GeneralUpdate.Core与GeneralUpdate.ClientCore 中重复代码,通用代码通过链接文件解决冗余问题。
(8)[NEW] 支持增量更新功能,例如:只更新了一个文件,那么就只将该文件打包。
(9)[NEW] 支持二进制差分功能,例如:temp.dll 发生了修改产生了新版本的文件,那么将会把temp.dll的新版本文件和老版本文件做一个差分。最后生成一个.patch的补丁文件,按照正常项目迭代那么这个.patch的补丁将会是kb级的。再配合7z的高压缩将更新包的大小做到目前状态下的极致节省流量和带宽占用。特别需要说明的是,如果在新版本中添加了新文件还是会将新增文件原封不动的打包到更新包中。
【4】组件[NEW]GeneralUpdate.Differential
在GeneralUpdate中新增组件Differential,该组件主要提供以下功能:
(1)[NEW] 新增二进制差分更新,生成.patch补丁文件。
(2)[NEW] 新增增量更新,例如:version 1.1.1.1原有10个文件这次版本发布修改了其中3个文件那么只会将修改的文件进行打包。
(3)[NEW] 更新配置文件(目前只支持.json配置文件且内容深度为1级),例如:客户端程序使用.json格式文件作为配置文件,那么将会保留客户端原有配置内容的前提下更新配置文件内容。假设客户端原有配置文件(.json)中包含内容:
代码语言:javascript复制{
"ip":"123456789",
"port":9999
}
服务端新的配置文件结构为:
代码语言:javascript复制{
"ip":"0",
"port":0,
"path":"c://"
}
那么将会把,“path”字段更新到客户端本地配置文件中并保留原有内容为:
代码语言:javascript复制{
"ip":"123456789",
"port":9999,
"path":"c://"
}
【5】组件GeneralUpdate.Zip
(1)[REFACTOR] 重构压缩组件设计,将支持.zip和.7z压缩包格式。
(2)[NEW] 添加7z解压功能。
【6】组件[REMOVE]GeneralUpdate.Common
(1)移除该组件,解除GeneralUpdate.Core与GeneralUpdate.ClientCore 耦合,发现目前版本并不需要。
【7】组件GeneralUpdate.Single
本次未更新实际功能。
【8】测试用例 Example
为简化开发者在验证、测试过程中编写用例开发工作。在GeneralUpdate解决方案中添加了以下测试用例:
- AutoUpdate.ClientCore
- AutoUpdate.Core
- AutoUpdate.MD5
- AutoUpdate.Differential
- AutoUpdate.ZIP
- AutoUpdate.MinimalService
- AutoUpdate.Test
以上组件将会同步到github、gitee、nuget平台