GeneralUpdate20220323里程碑版本發布

大家好我是juster,GeneralUpdate的開源項目作者。這次將發布GeneralUpdate里程碑版本,該版本發生了巨大改變歷時4個月的時間終於要和大家見面了。開源不易希望大家能多多支援。可能或多或少會有些bug希望大家多多回饋,這裡也有一個小小的心愿希望這個開源項目能上1000star,拜託各位小夥伴了。

  • github://github.com/WELL-E/AutoUpdater

  • gitee://gitee.com/Juster-zhu/GeneralUpdate

  • 在線幫助文檔://justerzhu.cn/  (後續將會按組件拆分成對應的文檔)

  • Nuget版本管理參考標準://docs.microsoft.com/zh-cn/nuget/concepts/package-versioning

  • 應用程式集版本管理參考標準://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社區發起招募希望可以有更多的小夥伴加入到開源中來。依舊保持之前所說的獎勵機制(//mp.weixin.qq.com/s/jP4T_M1pqpZ49g7cSs2rnw)或根據貢獻難度分配給參加開源的開發者們。

補充:需提交功能性、重要修改PR(「蜻蜓點水」的PR不算在獎勵分配的考慮範圍內)、重要平台調研或測試工作。

特別感謝@Weihan Li 、@lindexi 、 @walterlv 以及@github參考的開源項目作者們(參考程式碼均為MIT協議不會發生其它協議混淆造成「程式碼感染」),在此期間的技術解答和參考的技術文章、程式碼。如果沒有社區的小夥伴的支援GeneralUpdate將會很難進步。

 

2.開源建設

我的目前的想法如下,不知道合不合適。如果有任何想溝通交流的可以郵件聯繫我[email protected]

 

  • (1)捐贈10元,提供使用解答,在線文檔。

  • (2)捐贈100元,提供最新版本的GeneralUpdate簡易設計文檔、使用教學影片(文檔將以郵件的方式發送至捐贈者的郵箱中)。

  • (3)捐贈1000元,提供針對本組件的技術支援。

  • 需要特別說明的是,在使用開源項目的過程中遇到的問題希望在github或gitee上提交issue或PR以方便大家在網路上搜索問題及解決方案,請勿單獨私聊(在平台上提交issue或PR我這裡都是有郵件通知的會第一時間進行回復和解答)。

  • 所有的文檔及影片教程將在版本發布後陸續補充(發布之日起一個自然月內補齊)。

以上所有的捐款將會透明公開、並用於開源項目的建設中。所有的捐贈者提供捐贈截圖和個人郵箱(不公開)登記記錄,並會在GeneralUpdate的readme.md中記錄在捐贈牆上。另外會將提交PR的開發者記錄在readme.md中記錄在貢獻牆。

捐贈通道目前考慮的是集中在gitee的捐贈功能當中,這樣捐獻的資金大家都看到見。(//gitee.com/Juster-zhu/GeneralUpdate

*這裡,特別說明一下為什麼會制定這樣的捐贈規則。

  • GeneralUpdate項目是基於MIT(//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中重載了配置方式,該方法簡化為只需要傳遞遠程伺服器地址例如//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最新動態將優先在本公眾號發布,關於本次發布分享到這裡,感謝各位的閱讀。