从上次开始学习Asp.Net Core以来,一直都是玩一玩,还没有什么机会用来实战,最近单位有个新的小项目,于是我用Asp.Net Core来尝尝新,结果也是非常OK,熟悉之后开发效率感觉和Django基本没差。
那么进入正题,本文简单说说Asp.Net Core应用的构建和部署。
构建
构建是使用build
命令,不过一般我们都用vs或者rider之类的IDE,应该比较少会用到这个命令:
dotnet build
发布
本文着重说一下发布这块。发布顾名思义就是把项目编译成一个可执行的文件,可以方便我们拿到其他机器或者是部署到服务器上去运行,对于Java,就是打包成jar包,依赖JavaRuntime运行,或者是可以放到Tomcat运行的war包;对于go语言,是生成一个可执行的文件,一把梭执行就完事了;对于Python语言,不好意思,好像没有什么很好的方案,可以打包成wheel包,也可以pyinstaller打包exe,不过对于web应用的部署,一般还是用docker。
那么对于我们Asp.Net Core应用来说,和go语言一样,非常方便,可以打包成单个的可执行文件,一个字,爽!
参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-publish
最简单的发布命令是:
dotnet publish
使用了这个命令,会在publish目录生成一大堆的文件,包括依赖啊,应用的核心dll包,以及对应平台的可执行文件。请注意,这样生成的一大堆文件是要依赖于本机上的.NetCore Runtime来执行的。
为了方便起见,我们肯定不想在部署的时候还需要在服务器上安装.NetCore Runtime呀,所以看下面。
构建不依赖DotNet Sdk的可执行文件,需要制定目标平台:
dotnet publish -r <RID>
其中,
RID
参考:https://docs.microsoft.com/zh-cn/dotnet/core/rid-catalog
附上几个常用的吧:
- Windows
- win-x86
- win-x64
- win-arm
- win-arm64
- Linux
- linux-x64
- linux-arm
- linux-arm64
例如我要构建一个在Linux服务器上可以使用的可执行文件,使用以下命令:
dotnet publish -r linux-x64
生成的文件如下:
可以看到这一大坨有三百多个文件夹和文件,这样放到服务器是真的麻烦,又占地方又丑,再看看大小:
一百多M,这也太占空间了,上传到服务器都要等好久,不过别急,接下来微软的黑魔法来了~
搭配上这俩选项
dotnet publish -r linux-x64 -c Release -p:PublishSingleFile=true -p:PublishTrimmed=true
运行一下,嗖!
再看看生成的文件,只有一个可执行文件和几个配置文件、web静态文件目录!(因为我用Debug版,所有有pdb调试文件)比刚才清爽多了!
我们再看看文件大小:
比刚才小了几十M!这下舒服了!
接下来介绍一下多的那两个参数,感觉不用介绍大家也猜到了~
-c Release
表示以Release配置来生成-p:PublishSingleFile=true
表示生成单个可执行文件,像go那样-p:PublishTrimmed=true
表示裁剪可执行文件的大小,就像大家看到的那样,大小缩减了几十M!
这样直接把这个可执行文件丢到服务器上就可以运行了,不过ssh一断开就又没有了~
所以接下来介绍使用supervisor来监控web应用的运行
部署
我们选择supervisor这个简单的工具来管理和监控web应用的运行,它是python写的,简单好用。
首先需要安装,可以使用pip:
pip install supervisor
然后在/etc/supervisord.d/
目录下创建我们的配置,这里有个模板可以参考。
[program:swatow_affairs]
# 脚本目录
directory = /path/dotnet/swatow_affairs
# 脚本执行命令
command = /path/to/swatow_affairs/SwatowAffairsBackend --urls "http://*:15001;"
# supervisor启动的时候是否随着同时启动,默认True
autostart = true
# 当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,
# 有三个选项,false,unexpected和true。
# 如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart = true
# 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs = 1
# 脚本运行的用户身份
user = root
# 日志输出
stderr_logfile = /path/to/swatow_affairs/log/stderr.log
stdout_logfile = /path/to/swatow_affairs/log/stdout.log
# 把stderr重定向到stdout,默认 false
redirect_stderr = true
# stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20
# stdout日志文件备份数
stdout_logfile_backups = 20
把这个文件配置好之后就可以启动supervisor了,命令如下:
systemctl start supervisord.service
也可以使用:
service supervisord start
不同的Linux发行版命令有所差别,可以自行查阅文档。
启动supervisor之后,我们的配置文件会自动加载,然后我们的web应用也就随之启动啦。
更多配置可以查看supervisor的官方文档:https://github.com/Supervisor/supervisor
参考资料
欢迎交流
我整理了一系列的技术文章和资料,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~
标签:可执行文件,Core,Asp,supervisor,stdout,dotnet,Net,true From: https://www.cnblogs.com/deali/p/18011882