最近接触了一下微软的ASP.NET Core 5.0,说实话跟我好多年前用过的.net已经不是一个东西了。进化得太快了。
这东西很强大,完全跨平台,最牛的是可以跟运行时环境一起打包发布成单个文件。目标机器啥环境也不用配。Cool
我尝试在Mac下制作了一个包含数据库增删查改的简单站点并打包成一个单文件扔到我那台仍在服役的树莓派2B上直接就跑起来了。
下面是网站
要知道,在以前是需要dotnet xxxxx.dll 这种方式才能运行的。等于是加了一层壳。在linux下运行一个名字叫dll的文件怎么看都怪怪的不是吗。查了资料,这个特性在.net core3.0就已经支持了,但做法是不一样的,3.0的时候其实是一个自解压的过程,运行之前会先自解压到一个临时目录再运行,而现在的5.0则不需要先解压,效率上也高了很多。
话说回来这个特性其实也没啥好吹的,早该支持了。人家go老早就这么干了。啥也不用依赖,编译完就一个可执行文件。
不过这种都是牺牲文件size作为代价的,go也一样。一个命令行helloworld都得好几十MB。我这个简单webapp打包完了有100MB。想要size小就别包含运行时,鱼与熊掌的问题。
方法
在项目根目录执行一下命令即可。注意这里的环境指的是目标环境而不是当前的开发环境。比如你完全可以在Mac上开发然后使用下列命令生成可以直接在树莓派上运行的可执行文件。Cool
dotnet publish -r 运行时标识符(RID) -p:PublishSingleFile=true --self-contained true
其中 -r 指明目标环境,常见的RID有
- win-x64(64位)
- win-x86(32位)
- linux-x64(大多数桌面发行版,如 CentOS、Debian、Fedora、Ubuntu 及派生版本)
- linux-arm(32位ARM,如 树莓派2B)
- linux-arm64(64位ARM,如 树莓派3B)
- osx.10.15-x64(MacOS 10.15 Catalina)
更多完整RID列表请参考官方文档。