大家好我是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%E8%AE%B8%E5%8F%AF%E8%AF%81/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的版本。
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 和更新程式名稱即可,簡化了開發者需要關心的引數元件內自動獲取。
public GeneralClientBootstrap Config(string url, string appName = "AutoUpdate.Core");
(2)[NEW] 新增了最新版本接收推送功能,VersionHub物件。主要解決臨時需要接收緊急修復重大bug的版本,可以在GetMessage回撥函式中可新增更新操作。
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回撥函式中可新增更新操作。
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)中包含內容:
{
"ip":"123456789",
"port":9999
}
服務端新的配置檔案結構為:
{
"ip":"0",
"port":0,
"path":"c://"
}
那麼將會把,“path”欄位更新到客戶端本地配置檔案中並保留原有內容為:
{
"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平臺,歡迎大家轉發、關注、支援、打賞。GeneralUpdate最新動態將優先在本公眾號釋出,關於本次釋出分享到這裡,感謝各位的閱讀。