上周,我发布了对.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
我将会写一篇文章讲解这个软件的实现原理,欢迎关注。