linux进程文件瘦身,.NET跨平台实践:Linux .Net Core自宿主应用程序瘦身记

一,.NET Core 自宿主应用程序个头有点大

发布.NET Core应用程序有两个方式,一种是“便携式”,一种是“自宿主式”。便携式发布时,目标程序不带.net core运行环境,所以“个头”很小,可能只有几十K几百K字节,但是它需要用户的目标系统上安装.NET CORE 框架;自宿主式发布出来的程序,自带运行时和框架类库,自成一体,不需要客户机安装.NET CORE环境,部署简单方便。

看看一个简单的“Hello World!” 控制台程序有多大:

AAffA0nNPuCLAAAAAElFTkSuQmCC

修改 csproj文件,添加目标系统:

AAffA0nNPuCLAAAAAElFTkSuQmCC

用 dotnet publish -r:linux-x64 针对linux平台发布,得到目标文件(夹),现在看看大小:

AAffA0nNPuCLAAAAAElFTkSuQmCC

这个Hello World 控制台程序的目标文件,总大小达到了62.2 MB!

二,为什么.net core自宿主程序这么大

原因有二,一是为了能在目标系统上 “独立” 运行,自宿主程序必须自带运行时,这无可厚非,二是不管是用 dotnet publish命令行发布还是用VS发布,它们都会不分青红皂白地把.net core类库整个发布到目标程序中,这正是使目标程序变大变肥的主要原因。

下面是发布后的部分文件列表,可以看出,很多的dll与这个hello world 程序毫无关系!

AAffA0nNPuCLAAAAAElFTkSuQmCC

三,给 Linux .Net Core 自宿主应用程序瘦身

为什么要给“自宿主”程序瘦身?原因是,既然发布“自宿主”程序而不是便携式程序,一般都是程序作者或厂商希望产品能有更好的独立性,更看重程序本身的完整和纯净,不喜欢附带一些乱七八糟的东西。另外,程度体积小一些,能更方便地在卡片机(如树莓派)、小型专用设备这类存贮空间不太富裕的设备上部署,在Dockeer中部署,也能大大减小映像的大小,在同样的空间中运行更多的服务。

从前边的分析可以看出,自宿主应用程序之所有“肥大”,是因为有太多的无关的类库或Native so库造成的,只要清理掉它们,瘦身的目标就达到了。

1,将发布的程序全部上传到Linux系统的某个文件夹,然后运行 chmod +x coretest,给coretest赋与可执行权限。(我写的这个hello word程序名叫“coretest”)。

AAffA0nNPuCLAAAAAElFTkSuQmCC

2,用 ./coretest 把程序运行起来:

AAffA0nNPuCLAAAAAElFTkSuQmCC

不要按键,让程序不要退出。

3,查出这个进程的PID:

再加一个终端,用 ps -ef | grep coretest 查出这个进程的PID号

AAffA0nNPuCLAAAAAElFTkSuQmCC

4,列出进程关联文件:

用 sudo lsof -p PID号,列出指定进程调用/引用的文件,从列表中找出属于这个core程序依赖的类库和core Navite函数库:

特点:路径都指向这个core程序所在的文件夹。

下图是列表的一部分:

AAffA0nNPuCLAAAAAElFTkSuQmCC

从列表中,可以看出,本 coretest 程序,相关的文件有如下三类14个文件:

1)coretes加载程序和程序集:

coretest

coretest.dll

2)依赖的.net 框架程序集:

System.Runtime.dll

System.Console.dll

System.Threading.dll

System.Runtime.Extensions.dll

System.Collections.dll

3)运行时函数库:

libclrjit.so

libcoreclr.so

libhostpolicy.so

libhostfxr.so

System.Native.so

System.Globalization.Native.so

System.Private.CoreLib.dll

5,修改依赖文件 coretest.deps.json,对依赖行配置文件瘦身:

打开 coretest.deps.json文件,你会发现所有的依赖库都在其中,重要的是49行开始的“runtime.linux-x64.Microsoft.NETCore.App/2.0.0”的runtimes和native两个节点,共有173个依赖项,与我们测试出来的14个依赖,整整多了近160个依赖项,这些多余的,都可以删除!

AAffA0nNPuCLAAAAAElFTkSuQmCC

删除后,deps.json一下子清爽了:

AAffA0nNPuCLAAAAAElFTkSuQmCC

6,测试依赖配置文件是否正确:

再次用 ./coretest 运行本程序,检查依赖项是否正确。当按任意键退出程序时,出现了下边的错误。

AAffA0nNPuCLAAAAAElFTkSuQmCC

原来,在Console.ReadKey返回时,会调用另一个dll,而之前用lsof时读取依赖时,程序没有执行到这一步,所以没有看到有这个依赖,这个依赖被误删了。所以,得重新加到deps.json文件中。

AAffA0nNPuCLAAAAAElFTkSuQmCC

再次测试,程序已经完全正常。

7,根据瘦身后的依赖关系,删除无关文件:

要点,需要保留依赖列表文件coretest.deps.json和运行时配置文件coretest.runtimeconfig.json。

8,再次测试程序运行情况:

运行 ./coretest,发现出了一个问题:

AAffA0nNPuCLAAAAAElFTkSuQmCC

原来还差一个native 函数库,怎么办?简单,从windows发布目录中,上传到Linux的这个程序文件夹中。

再次运行,一帆风顺,瘦身工作正式完成!

AAffA0nNPuCLAAAAAElFTkSuQmCC

现在看看这个程序,共计还有多少文件:

AAffA0nNPuCLAAAAAElFTkSuQmCC

哈哈,现在只有19个文件!比如之前的近180个文件,这个”身“瘦得厉害吧,简直是一身清爽呀!

瘦身后,这个程序所有文件从62.2M变成了24.3m,打包压缩后,只有8.62M。

附记:

有的朋友可能会说,还是有点大呀,一个hello world就有19个文件24m大小,如果我司开发一个功能完整的商业应用会不会大得吓人?其实,我可以告诉你:

一,这19个文件已经具备了.net core的关键功能,你开发更大的商业应用,不外乎再多引用了几个dll而已,能再大多少?!

二,这个程序是自带了运行环境的,它自成一体,独立运行,不需要麻烦你和你的客户或运维人员在linux上安装安装一大堆东西,配置一大堆东西!

三,正因为这个程序可以独立运行,那么,如果放在Docker中,对docker镜像的体积影响可以忽略,你们镜像文件不会因为需要安装什么工作环境而增大数百M的体积。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自由宿主后台管理系统是一套通用后台管理系统,之所以给他加上“宿主”2个字,是因为这套系统本身没有自己的数据库,而必须依赖于其他数据库才能运行,自由指的是系统灵活性强,能够根据数据库表结构做一些简单的配置后系统就能够实现想要的功能。简单的说,就是系统没有根据特定的数据库来设计,你给他套上什么结构的数据库表,他就做什么样的事情。 自由宿主Asp.net网站通用后台管理系统特点如下: 1. 后台本身没有数据库,自己设计数据库后,与后台连接,配置好节点后无需二次开发,直接就可以实现对数据库增删改查功能; 2. 后台密码支持自定义加密/解密算法,可以在设置登录表的时候进行配置; 3. 后台编辑界面可以根据配置自动生成编辑器,同时会自动生成验证脚本; 4. 后台支持多表关联,列表查询时候会自动根据关联字段显示相应内容; 5. 兼容IE6+,火狐浏览器等主流浏览器; 6. 对数据库表的操作,如增删改查操作只需要进行简单的设置即可完成,无需再进行任何编码实现。 自由宿主Asp.net网站通用后台管理系统3.1正式版更新功能: 1. 修正首次登录页面设置登录表后出现404错误页面的问题; 2. 增加菜单权限控制,可以设置菜单是否有增删改功能; 数据库升级方式请参见 http://www.tzhtec.com/art/6f456394186.aspx 自由宿主Asp.net网站通用后台管理系统3.0正式版更新功能: 1. 调整列表和编辑界面样式,列表修改为采用easyui的grid显示; 2. 编辑页面日期、编辑器和验证脚本整理,调整到脚本文件edit.js中,如果有其他需求,可以修改该脚本文件; 3. 增加oracle和mysql数据库支持,支持,系统可以支持ms sql、access、oracle和mysql等主流数据库; 4. 由于原来的jquery.ui在系统上使用并不多,在本次改版后去除了jquery.ui,css和js上有大量瘦身; 5. 登陆后主页显示的default.aspx页面修改允许用户自行修改设置; 6. 系统对平台要求提升,最低运行环境为framework3.5,不再对framework2.0进行支持; 7. 对SQL查询语句做了优化; 8. 系统架构重新调整;
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值