当前位置: 首页 > news >正文

asp 执行 exe_Asp.Net Core学习笔记:(五)构建和部署

从上次开始学习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参考: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

生成的文件如下:c91cec221bac7dfdce1ff1b322e8f0a5.png

可以看到这一大坨有三百多个文件夹和文件,这样放到服务器是真的麻烦,又占地方又丑,再看看大小:7c8966d6c74096cf9de32e38b0ca232b.png

一百多M,这也太占空间了,上传到服务器都要等好久,不过别急,接下来微软的黑魔法来了~

搭配上这俩选项

dotnet publish -r linux-x64 -p:PublishSingleFile=true -p:PublishTrimme
d=true

运行一下,嗖!再看看生成的文件,只有一个可执行文件和几个配置文件、web静态文件目录!(因为我用Debug版,所有有pdb调试文件)比刚才清爽多了!

0ef9fbd701006bb17ef900e86f116c9d.png

我们再看看文件大小:d7b12191f4d61d06491634b7d1fdffa9.png

比刚才小了几十M!这下舒服了!

接下来介绍一下多的那两个参数,感觉不用介绍大家也猜到了~

  • -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

参考资料

  • https://www.cnblogs.com/toutou/p/supervisor.html

欢迎交流

我整理了一系列的技术文章和资料,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~

相关文章:

  • mybatis if test 用法_手写一个简易版的Mybatis,带你深入领略它的魅力
  • python写入excel数据时保存之前内容_如何使用python在保留原excel格式的前提下插入/修改数据...
  • asp.net web开发框架_ASP.NET Core Blazor未来的Web开发框架
  • 操作系统实验c语言页面置换算法(lru和lfu算法)_「任性」的C语言之父:因拒付论文装订费错失博士学位,论文52年后重见天日...
  • python生日快乐代码_【震惊小伙伴的单行代码—Python篇】的实践操作
  • c3p0连接池配置_数据库连接池amp;Spring JDBC(JdbcTemplate)
  • cdr自动排版插件_牛逼!网上卖328的CorelDraw插件免费送一键转曲批量导图文字识别...
  • python最接近某个值怎么表示_在python3中实现查找数组中最接近与某值的元素操作...
  • java连接rabbitmq_RabbitMQ指南之一:Hello World!
  • python if 单行_学python时,发现很多高手的代码只有一行或几行就达到了我多行代码一样的功能,应该追求这种简洁吗?...
  • python openpyxl读写xlsx_Python使用openpyxl读取、修改excel文件及绘chart图(支持xlsx)...
  • java array 元素的位置_JAVA《集合框架》
  • 植物图像识别python_python 实现图像识别
  • python开发博客系统_python 全栈开发,Day80(博客系统分析,博客主页展示)
  • python如何执行部分代码_Python 在局部变量域中执行代码
  • [LeetCode] Wiggle Sort
  • 【RocksDB】TransactionDB源码分析
  • JavaScript DOM 10 - 滚动
  • js算法-归并排序(merge_sort)
  • mongo索引构建
  • scala基础语法(二)
  • Service Worker
  • vue-router 实现分析
  • 测试如何在敏捷团队中工作?
  • 当SetTimeout遇到了字符串
  • 将 Measurements 和 Units 应用到物理学
  • 我从编程教室毕业
  • 写代码的正确姿势
  • 自动记录MySQL慢查询快照脚本
  • 如何用纯 CSS 创作一个货车 loader
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • $.each()与$(selector).each()
  • (4)logging(日志模块)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (力扣)1314.矩阵区域和
  • (十八)三元表达式和列表解析
  • (十三)Maven插件解析运行机制
  • (四) 虚拟摄像头vivi体验
  • .bat批处理(六):替换字符串中匹配的子串
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 使窗口永不获得焦点
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ Linux ] Linux信号概述 信号的产生
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2016.7.Test1] T1 三进制异或
  • [android] 练习PopupWindow实现对话框
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BetterExplained]书写是为了更好的思考(转载)
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [FZSZOJ 1223] 上海红茶馆