ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署

原文: ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署

背景:

这周,心情来潮,想把 Aries 开发框架 和 Taurus 开发框架 给部署到Linux上,于是开始折腾了。

经过重重非人的坑,终于完成了任务:

Aries on CentOS7:mvc.aries.cyqdata.com

Taurus on CentOS7:mvc.taurus.cyqdata.com

不过在发布的过程中,发现有大堆共同的dll(100多个,20多M):

分享图片

看见一大堆这些dll,感觉很影响视觉,而且多个项目就要上传多份,很是麻烦。

于是研究了一下,能不能把这些和项目的文件分开,独立到一个指定的目录中去。

研究过程:

为什么要研究,因为网上根本搜不到啊,我X,这.net core 都出这么多年了,就没人有点洁癖,把这事给解决然后写篇文章么!

1、本人机器早期装的是VS2017版本,发布版本时,没有“部署模式”选项。

2、后来升级了一下,发现版本选项里有“部署模式”选项,里面有框架依赖和独立两种,于是看了下相关说明:

.NET Core 应用程序部署

可以为 .NET Core 应用程序创建三种部署:

  • 依赖框架的部署。 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core。 由于已存在 .NET Core,因此应用在 .NET Core 安装程序间也是可移植的。 应用仅包含其自己的代码和任何位于 .NET Core 库外的第三方依赖项。 FDD 包含可通过在命令行中使用 dotnet 实用程序启动的 .dll 文件。 例如,dotnet app.dll 就可以运行一个名为 app 的应用程序。

  • 独立部署。 与 FDD 不同,独立部署 (SCD) 不依赖目标系统上存在的共享组件。 所有组件(包括 .NET Core 库和 .NET Core 运行时)都包含在应用程序中,并且独立于其他 .NET Core 应用程序。 SCD 包括一个可执行文件(如 Windows 平台上名为 app 的应用程序的 app.exe),它是特定于平台的 .NET Core 主机的重命名版本,还包括一个 .dll 文件(如 app.dll),而它是实际的应用程序。

  • 依赖框架的可执行文件。 生成在目标平台上运行的可执行文件。 类似于 FDD,依赖框架的可执行文件 (FDE) 是特定于平台的,而不是自包含的。 这些部署的运行仍依赖于现有的 .NET Core 共享系统级版本。 与 SCD 不同,应用仅包含代码和任何位于 .NET Core 库外的第三方依赖项。FDE 生成在目标平台上运行的可执行文件。

经过研究测试,不管哪种方式,发布后,还是有一大堆Microsoft.XXXX.dll。

然后认真看仔细后发现,FDD部署,也是不处理依赖第三方依赖项的。

你连Microsoft和System打头的都叫第三方依赖项,哥也没办法了。

 

后来想到配置文件:*.runtimeconfig.json,感觉这里应该能折腾点什么。

{
  "runtimeOptions": {
    "tfm": "netcoreapp2.0","framework": {
      "name": "Microsoft.NETCore.App","version": "2.0.0"
    },"configProperties": {
      "System.GC.Server": true
    }
  }
}

百了和runtimeconfig.json相关的文章,发现一篇翻译自老外的文章:

https://www.cnblogs.com/lwqlun/p/9704702.html

按着关键说明,以为找到了春天:

分享图片

于是在:additionalProbingPaths 这个属性上陷入了不归路,特别是packages这个起名,让我一路以为它和第三方依赖包有关。

结果却不管怎么折腾,都悲催了。

最后只能看原文,然后看源码是怎么加载配置文件的。

配置文件加载的源码:https://github.com/dotnet/core-setup/blob/v2.1.3/src/corehost/cli/fxr/fx_muxer.cpp#L464

结果一堆C++,看的好不头痛,还是暂时放弃了,感觉情绪未到。

休息了一会,又重新把文章给仔细看了一下,开始关注了一下*.deps.json,

毕竟这个文件,默认是不用上传的,所以很自然性的被忽略了。

不过当我把它上传上去的时候,发现它被加载,而且,报错了。

感觉找到了方向:

现在仔细一看,deps应该depends依赖的简写,用于处理依赖包配置的。

解决方案:

 Linux下的web目录是这样的:

分享图片

于是,把*.deps.json里面 lib/开头的路径,全部给换成 /home/web/package ,然后上传,结果,OK了。

最后的部署目录,就剩下这么干净了:

分享图片

总结:

虽然最后定位到deps.json可以处理这个事,不过默认产生的deps.json东西有点多,要替换的路径也有点多。

估计再研究一下,应该还可以简化一下这个工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在开发中,有时候生成验证码的场景目前还是存在的,本篇演示不依赖第三方组件,生成随机验证码图片。 先添加验证码接口 public interface ICaptcha { /// <summary> /// 生成随机验证码 /// </summary> /// <para
后端技术 .net code 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1 上传方式:multipart/form-data 其他参数:Name,Versio
在上一篇文章中,我们比较出单表插入9999行数据,Freesql > Dapper > EfCore。在本文中,我们来看看级联插入 构建9999行数据 List<Entity> datas = new List<Entity>(); for (int i
需求:导入9999行数据时Dapper, Ef core, Freesql 谁的性能更优,是如何执行的,级联增加谁性能更佳。 确认方法:sql server 的 sys.dm_exec_query_stats SELECT TOP 1000 (select [text] from
资料整理 1.sp-api介绍:https://developer.amazonservices.com/ 2.github文档:https://github.com/amzn/selling-partner-api-docs 3.github代码:https://github.com/amzn/s
最近时间在整SM2算法,在网上看到不少代码,基本都是使用BouncyCastle库,现在这个版本算比较好的拿来分享给大家。 首先引入包 Portable.BouncyCastle 完整代码见Gitee:https://gitee.com/Karl_Albright/CryptoHelper
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发、订阅和处理的流程。这种实现太简单了,百十行代码就展示了一个基本工作原理。然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走。今天,我们就研究一下在事件处理器中,对象生命周期的管理问题。事实上,不仅仅是在事件处理器
上文已经介绍了Identity Service的实现过程。今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关。 回顾 《Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)》 Weather API Weather
最近我为我自己的应用开发框架Apworks设计了一套案例应用程序,并以Apache 2.0开源,开源地址是:https://github.com/daxnet/apworks-examples,目的是为了让大家更为方便地学习和使用.NET Core、最新的前端开发框架Angular,以及Apwork
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度。很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅、通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现。接下来对于事件驱动型架构的讨论,就需要结合一个实际的架构案例来进行分析。在领域驱动设计的讨论范畴,CQRS架构本身就是事件驱动的,因此,
HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单、统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable)更强,并具有自描述的特点。使用了HAL的API会更容易地被第三方开源库所调用,并且使用起来也很方便
何时使用领域驱动设计?其实当你的应用程序架构设计是面向业务的时候,你已经开始使用领域驱动设计了。领域驱动设计既不是架构风格(Architecture Style),也不是架构模式(Architecture Pattern),它也不是一种软件开发方法论,所以,是否应该使用领域驱动设计,以及什么时候使用
《在ASP.NET Core中使用Apworks快速开发数据服务》一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介绍,你会看到,使用Apworks框架开发数据服务是何等简单快捷,提供的功能也非常多,比如对Hypermedia的
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证。在本讲中,我们会讨论在当前这种架构的应用程序中,如何完成用户授权。 回顾 《Angular SPA基于
Keycloak是一个功能强大的开源身份和访问管理系统,提供了一整套解决方案,包括用户认证、单点登录(SSO)、身份联合、用户注册、用户管理、角色映射、多因素认证和访问控制等。它广泛应用于企业和云服务,可以简化和统一不同应用程序和服务的安全管理,支持自托管或云部署,适用于需要安全、灵活且易于扩展的用
3月7日,微软发布了Visual Studio 2017 RTM,与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0,尽管这些并不是最新版,但也已经从preview版本升级到了正式版。所以,在安装Visual Studio 2017时如果启用了
在上文中,我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body。今天,我们再扩展一下设计,让我们自己设计的中间件变得更为通用,使其能够应用在不同的Route上。比如,我们可以设计一个通用的替换response body的中间件,然后将其应用在多个Route上。 O
不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支持。这个框架的开发和维护我坚持了很久,一直到2015年,我都一直在不停地重构这个项目。目前这个项目在
好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名《Angular单页面应用基于Ocelot API网关与IdentityServer4ʺSP.NET Identity实现身份认证与授权》,然而如你所见,这样的名字实在是太长了。所以,我不得不缩写“单页面应用”几个字