.NET Core剪裁器Zack.DotNetTrimmer升級瘦身引擎,並支援剪裁計劃的錄製和回放

楊中科發表於2022-03-21

上週,我釋出了對.NET Core程式進行瘦身的開源軟體Zack.DotNetTrimmer,與.NET Core內建的剪裁器相比,Zack.DotNetTrimmer不僅對程式的剪裁效果更好,而且還支援WPF、WinForm程式。下面是Zack.DotNetTrimmer與.NET內建的剪裁器的對比圖:

 

專案地址:https://github.com/yangzhongke/Zack.DotNetTrimmer

 

一週時間內,相關文章在各平臺獲得了超過四萬閱讀量,專案收穫了將近170+個star,朋友們反饋了很多的功能建議,因此本週我對它進行了升級。本文將會對這些升級的新功能做介紹。

新功能一、支援剪裁計劃的錄製和回放

預設情況下,Zack.DotNetTrimmer會在被裁剪的程式退出後立即進行程式的裁剪。但是,在比較複雜的專案中,我們可能需要多次以不同的環境、配置、登入使用者等來執行被裁剪的程式,以便於全面覆蓋程式碼的執行路徑,最後再統一進行裁剪。

因此,本程式增加支援【錄製】、【應用】兩種執行模式。在【錄製】模式下,它會把程式的剪裁計劃記錄到一個記錄檔案中,如果這個記錄檔案已經存在,則它會把程式的剪裁計劃追加到記錄檔案中。在我們多次以【錄製】模式執行待裁剪的程式後,我們再用【應用】模型執行本程式,並且指定之前記錄的檔案,它就會根據記錄檔案中的資訊對程式進行裁剪。

比如,我們先以【錄製模式】啟動待裁剪的程式,指定把剪裁計劃記錄到d:/1.json檔案中,然後我們以使用者A的身份對程式進行測試;然後我們再以【錄製模式】啟動待裁剪的程式,同樣指定把剪裁計劃記錄到d:/1.json檔案中,並以使用者B的身份對程式進行測試,從而覆蓋在以使用者A的身份執行的時候沒有覆蓋到的程式碼。最後,我們再以【應用模式】啟動待裁剪的程式,指定剪裁計劃檔案為d:/1.json,這樣Zack.DotNetTrimmer就會把兩次【錄製模式】的程式碼載入結果合併然後進行程式的裁剪。

這個功能可以用於自動化測試,只要確保多個自動化測試程式的剪裁計劃使用同一個記錄檔案即可。

這個功能也適用於自動構建,我們可以把提前完成的剪裁計劃檔案重複使用,從而實現在程式釋出完成後以【應用模式】執行Zack.DotNetTrimmer,從而實現自動化地進行程式的裁剪。

新功能二、支援刪除未使用的類

預設情況下,Zack.DotNetTrimmer會把沒有被載入的程式集刪除。我們知道,對於被載入的程式集,其中仍然有可能存在沒有被使用的類,如果對這些類進行裁剪,那麼我們就可以進一步壓縮.NET Core程式的大小。

新版的Zack.DotNetTrimmer支援“貪婪剪裁”的選項,啟用這個選項後,它會嘗試把程式集中未使用的類也刪除。以TeeChart這個控制元件的winform版演示程式為例,使用預設選項裁剪後,程式的大小從161.78 MB壓縮為79.90 MB,而使用“貪婪剪裁”選項後,程式進一步壓縮為78.38 MB,也就是又刪除了1.52 MB無用的程式碼。

受制於技術實現的限制,目前它暫時無法清理含有原生程式碼(比如NGen等)的程式集中的類,而且它只是把類的方法體清除,並不會完全刪除類。我會繼續研究改進這個專案,歡迎各位反饋建議。

專案地址:https://github.com/yangzhongke/Zack.DotNetTrimmer

我將會寫一篇文章講解這個軟體的實現原理,歡迎關注。

相關文章