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东西有点多,要替换的路径也有点多。
估计再研究一下,应该还可以简化一下这个工作。
补充说明:*.runtimeconfig.json里的additionalProbingPaths,这个属性也要加,不加会提示找不到文件。
ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署的更多相关文章
- ASP.NET Core 共享第三方依赖库部署的正常打开方式
曾经: 写了一篇: ASP.Net Core on Linux (CentOS7) 共享第三方依赖库部署 当第二次想做相同的事,却遇上了Bug,于是有了第二篇: ASP.NET Core 共享第三方依 ...
- ASP.NET Core 共享第三方依赖库部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)
背景: I try to put the Microsoft.*.dll and System.*.dll togather to a new folder.以便把(第三方或)系统的和应用的dll分开 ...
- .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线
Powered by ASP.NET Core on Linux! 我们全站的 .NET Core 迁移工作如火如荼,这是我们今年上半年的重要工作. 今天我们终于完成了博问产品(q.cnblogs.c ...
- ASP.NET Core使用Docker进行容器化托管和部署
一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- [ASP.NET Core开发实战]基础篇02 依赖注入
ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...
- qt5.11.2+vs2017环境下配置pcl1.8.1以及第三方依赖库vtk的编译
1.准备工作 我所用的开发环境是win10下的qt5.11.2配置了vs2017的编译器,根据自己所用的VS的版本去官网下载对应版本的pcl库,如下 PCL-1.8.1-AllInOne-msvc20 ...
- 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?
我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合.对此比较了解的读 ...
- Jexus 5.8.3正式发布:Asp.Net Core在Linux上最友好服务器平台
Jexus Web Serever 是一款运行于 Linux 操作系统,以支持 ASP.NET.ASP.NET CORE.PHP 为特色的高性能 WEB 服务器和反向代理服务器.最新版 5.8.3 已 ...
随机推荐
- tkinter中scale拖拉改变值控件(十一)
scale拖拉改变值控件 使用户通过拖拽改变值 简单的实现: import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya. ...
- 关于js中对象和函数的一道问题
今天在写代码的时候遇到一个问题,没有解决,又在sf上提问了..冏..,最后讨论良久终于解决,和往常一样,做一个备忘,最近打算把印象笔记里的东西迁来.具体可访问http://segmentfault.c ...
- Nginx从听说到学会
第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一 ...
- Java与Kotlin, 哪个是开发安卓应用的首选语言?
Java是很多开发者创建安卓应用的首选语言.但它在 Android 界的领导地位正受到各种新语言的挑战,Kotlin就是其一.虽然Kotlin最近才开始受到热捧,但有为数不少的人相信 Kotlin 在 ...
- JAVA经典算法40题(原题+分析)之原题
JAVA经典算法40题(上) [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [程 ...
- handler.go
{ w.WriteHeader(http.StatusAccepted) } else { errStr := "" for ...
- BZOJ_2962_序列操作_线段树
Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...
- poj3352添加多少条边可成为双向连通图
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13311 Accepted: 671 ...
- HttpClient4 TIME_WAIT和CLOSE_WAIT
最近,公司的接口服务器(客户端,向外发送数据)频繁出现了connect timeout 以及readtime out 的情况,经过运维平台检测,并没有网络延时的情况.于是,开始怀疑连接池出了问题. 使 ...
- Java Applet 与Servlet之间的通信
1 Applet对Servlet的访问及参数传递的实现 2.1.1创建URL对象 在JAVA程序中,可以利用如下的形式创建URL对象 URL servletURL = new URL( "h ...