前言

在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的,那就没啥说的了,Come On!

发布

在这个时候我挺想也秀一把命令行,什么dotnet build啊,publish什么的,但是还是老老实实用我的宇宙第一神器吧。

右键工程发布。


这个地方我引用下官网的介绍。

依赖框架

优点:

  • 不需要设置部署的系统,因为都是通用的pe文件,这就是跨平台很嗨皮的地方
  • 部署包小
  • 允许程序使用net core最新的runtime
  • 多应用可通用一个net core类库

缺点:

  • 主机系统必须安装当前程序net core版本或更高的版本
  • 如果net core高版本砍掉部分使用的功能,那升级可能就会有问题

独立部署

优点:

  • 可以单独维护当前使用的net core
  • 目标系统也可以运行你的net core

缺点:

  • 需要提前选择你部署的系统
  • 部署包大,因为独立嘛
  • 每个应用自己本身都会带个net core,重复率,emm

其他的倒没有太多注意的地方,我这里选择的是依赖框架。

之后就是生成文件了,我们来看下这一堆玩意儿。

这里注意自己复制下April.xml这个文件,因为我没连带发布,留个坑。。。

测试

Windows

我们来试下dotnet命令吧。

直接访问https://localhost:5001吧,这里没有输出内容。

好了,这说明发布直接在Windows运行,应该是没啥问题。

IIS部署

本身想着这里都不多说了,后来一想,算了,既然写相关部署了,那哪能少的了这伴随了好长时间的IIS啊。

新建网站

这里注意下标注的模块,IIS部署net core需要单独安装一个.NET Core Windows Server Hosting,然后置于sdk到这一步了应该是都安装过了,路径就选择自己发布的路径。

然后在应用池中更改下托管。

之后运行网站就可以了,测试这块儿我就不放了,毕竟一般这地方没啥问题,如果前面都能运行的话,有问题的朋友可以私信我。

Linux

这里我用的是Centos 7(虚拟机Vmware),相关的安装软件什么的我在之前新手向相关的也已经介绍过了,这里不多说了,直接开始吧。

首先我们把publish下发布的文件打包上传到linux,我这里放的目录是/www/april-webapi/,这里我们直接运行的话,是不行的,毕竟linux下我们还没有安装dotnet相关的环境,已经安装的忽视。

一个是运行库dotnet,一个是运行时库runtime,这个都可以通过官网来下载的,当然可以直接通过docker(直接跳过这块儿往下看),但是我这里只是把我自己趟的一遍复述下而已。

$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install dotnet-sdk-3.0
$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install aspnetcore-runtime-3.0

ok,小等会儿就可以安装完了,完成之后,我们来切到工程目录下。

$ cd /www/april-webapi/publish/

来试下dotnet的命令吧。

$ dotnet April.WebApi.dll

运行之后,如果不出意外,我们会看到下面这个错误,当然如果你的工程比较简洁(什么引用都没有,就是个空工程),那这个地方你就完全运行了,但是那样的工程除了demo毫无卵用(就像我当年那么天真以为走一遍新建工程发布就已经大结局了一样)。

好了,不扯了,我们来看下这个问题,提示我们在对应lib/xxx路径下找不到xxx.dll,但是为何我们windows就可以了呢,这是因为类库缓存,在你运行程序的时候这些类库已经有了,默认会从net core的安装目录也就是系统盘下对应的不知道哪个文件夹下/lib/netstandardx.x/xxx.dll,所以windows下就没有报错。

这里我第一反应就是,那既然这样我就把需要的dll文件都放过来,然后路径换换不就得了(不得不说确实好麻烦),于是就这样一通操作,把类库都单独放到一个文件夹,其实发布之后的工程已然包含这些类库了,对April.WebApi.deps.json这个文件修改路径之后(我是全改成/lib/netcore-libs/xxx.dll),我们运行之后还是提示找不到。

对于这种现象,我只能说,世界之大~,然后继续查资料吧,最终在一个Nate McMaster的博客中找到了这个问题的解决方法,原来还有这个April.WebApi.runtimeconfig.json的属性additionalProbingPaths配置,这种要不是深入还真是不行啊,国外的钻研精神不得不说,值得学习,看过之后也发现,原来发布的文件夹中有一个这种写法的配置,注意看April.WebApi.runtimeconfig.dev.json,下面是我改动之后的April.WebApi.runtimeconfig.json

{
"runtimeOptions": {
"tfm": "netcoreapp3.0",
"framework": {
"name": "Microsoft.AspNetCore.App",
"version": "3.0.0"
},
"configProperties": {
"System.GC.Server": true
},
"additionalProbingPaths": [
"/lib/netcore-libs/"
]
}
}

配置好对应路径之后,我们来测试下,如果没有其他问题,应该跟我看到的界面效果一样,ok,那这样不就已经结束了。

Docker

docker的配置这块儿,我也是在Linux配置部署_新手向(五)——Docker的安装与使用简单的介绍了,包括基本用到的命令语句什么的。

这里直接来个Dockerfile吧,这里也只是简单写下需要的环境,端口,路径等基础配置。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE
EXPOSE
COPY . /app
ENTRYPOINT ["dotnet", "April.WebApi.dll"]

然后我们在当前目录下,运行以下命令生成镜像,注意末尾,还有个点,意思就是当前目录。

$ docker build -t april-webapi .

稍等一会儿(网速不好的话可能很长时间),提示完成的时候,我们来看下镜像。

$ docker images

看到有镜像那就说明走了一大半了,然后我们只需要运行镜像创建容器就行了。

$ docker run --name april-webapi-demo -d -p : april-webapi
$ docker ps -a

指定8080来接收80端口,指定名字叫april-webapi-demo,然后看下运行容器的情况。

这里我们看到已经创建了容器,但是注意状态EXIT(140),这很明显我们的程序跑了但是没有持久,emm,不持久可不行。

看下日志是咋回事吧。

$ docker logs april-webapi-demo

一看,哟,又是同样的错误,但是我们的路径已经指向绝对路径了,为啥还错呢,这里注意下,我们的类库是在linux下的根目录下的指定文件夹,但是docker呢,可以理解为单独的虚拟机,那很显然docker当中没有这个路径下的文件,那既然这样,我们就好解决了,因为Dockerfile中我们的WorkingDir是/app,那么我们是不是只要指定到这个目录下就可以了呢?Let's 踹踹。

首先我们在publish下创建个packages,然后把类库包复制到文件夹下,之后替换April.WebApi.deps.json中/lib/netcore-libs/为/app/packages/,这里说下为啥是/app/xxx呢,因为Dockerfile中配置的工作区为app。

一番替换之后,我们来重新走一遍build,这次改个名字(当然可以删除之前的无效镜像跟容器),重新运行下我们再看容器的状态,咦好像是可以了,那我们来访问下,这次用主机访问这个地址,看到这个界面之后,不禁感慨,路漫漫啊。

小结

这篇同样没有测试,因为一路都捎带着测试,所有的走完一遍之后,我在想,为何会这么麻烦,按说通用的话,一个文件夹移哪都能用才对,至于相对路径我也是试过,但是没有效果,应该还是那个配置查找路径的属性问题,我们还是需要先指明从哪读类库,后续看看有啥新进展的话,我还是会继续更新的。

在net core刚开始的时候,我们都已经知道这是一个要跨平台的,但是直到现在我才开始鼓捣linux下部署,实在是惭愧,一直在windows下让我有点儿过于舒适(当然还是因为windows服务器到期了),还是来一句结束吧,我们总是想的太多,而却做的太少,总以为理所当然,可现实四处碰壁,生活在于折腾,而折腾使人进步,树欲静而风不止,那就可劲儿刮吧。

from:https://www.cnblogs.com/AprilBlank/p/11757027.html

向net core 3.0进击——多平台项目发布与部署的更多相关文章

  1. 向net core 3.0进击——April.WebApi从2.2爬到3.0

    目录 前言 升级之路 测试 小结 前言 在之前对Swagger的变化做了调整后,就开始想着要不把之前的工程升级得了,这样就还是个demo工程,来做各种测试(当然还是因为懒),这就有了今天这个比较折腾的 ...

  2. 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  3. 向net core 3.0进击——Swagger的改变

    目录 前言 引入 测试 小结 前言 十一小长假在不知不觉间可都没了,在这个小尾巴的空隙,把这两天鼓捣的net core 3.0升级过程记录一下,首先还是根据之前的顺序一个个补充进来,先从Swagger ...

  4. DotNet Core 1.0 集成 CentOS 开发与运行环境部署

    一.     DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...

  5. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(1)

    .NET Core 3.0已经发布了,除了一大堆令人激动的功能以外,也增加了对WPF的正式支持, 那么WPF在.NET Core 3.0下的开发体验如何呢? 本文利用了Stylet框架开发.NET C ...

  6. 微软.NET CORE 3.0 预览版 7 发布:大幅减少 SDK 空间大小

    据悉,这个预览版是 .Net Core 3 中重要的版本,可以视为原计划在 7 月发布的 RC 版本 (引自微软 .NET Core 首席 Program Manager Richard 先生原话), ...

  7. 玩转 .NET Core 3.0:逐浪CMS新版发布,建站更简单、网站更安全

    2019年11月11日,在大家都忙于网上体会“双11 ”的热闹气氛的时候,逐浪CMS开发者团队正在做着新版本发布的最后工作.此次更新是基本于 .NET Core 3.0开发,也是全国首个基于 .NET ...

  8. 向net core 3.0进击——项目发布与部署

    目录 前言 发布 测试 小结 前言 在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的, ...

  9. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(2) - 单元测试

    上一章中我们完成了一个简单的登录功能, 这一章主要演示如何对Stylet工程中的ViewModel进行单元测试. 回忆一下我们的登录逻辑,主要有以下4点: 当"用户名"或" ...

随机推荐

  1. Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等

    MTV与MVC MTV模型: ​ M:模型层(models.py),负责业务对象和数据库关系的映射(ORM) ​ T:模板层(Template),负责如何把页面展示给用户(HTML) ​ V:视图层( ...

  2. 【Spring Cloud】Spring Cloud之Zipkin server搭建以及HTTP收集,分布式服务跟踪(2)

    一.搭建步骤 1)新建Spring Boot项目,引入pom坐标 <parent> <groupId>org.springframework.boot</groupId& ...

  3. 【Git】.DS_Store 是什么文件

    一.为啥会注意到该文件 合并代码的时候,.DS_Store文件发生了冲突,然后进入到项目目录去看,果然存在该文件,就比较好奇该文件是干什么的. 二..DS_Store 是什么文件 .DS_Store( ...

  4. JavaSE理论篇

    将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...

  5. 洛谷 P1330 封锁阳光大学题解

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  6. Java-驼峰命名与下划线命名互转

    package com.xsh.util; /** * String工具类 * * @author xieshuang * @date 2019-05-23 */ public class Strin ...

  7. 那周余嘉熊掌将得队对男上加男,强人所男、修!咻咻! 团队的Beta产品测试报告

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:Beta阶段团队项目互评 团队名称: 那周余嘉熊掌将得队 作业目标:项目互测互评 队员学号 队员姓名 博客地址 备注 221600131 ...

  8. mysql考题

    mysql 的考题 数据库考试题目 名字: 一.简答 1. mysql的管理员是?mysql的端口是? root,3306 2. mysql中常见的数据类型有哪些, int  char  varcha ...

  9. initState 必须调用 super.initState(); 否则报错

    @override void initState() { // initState 必须调用 super.initState(); 否则报错:info: This method overrides a ...

  10. spark的RDDAPI总结

    下面是RDD的基础操作API介绍: 操作类型 函数名 作用 转化操作 map() 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD flatMap() 参数是函数,函数应用于RDD每一个元素 ...