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 已 ...
随机推荐
- 使用SimHash进行海量文本去重[转载]
阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...
- 一个比ack速度快n倍的代码搜索工具: ag
一个比ack速度快n倍的代码搜索工具: ag 银搜索者(The Silver Searcher) 一个类似于代码搜索工具ack,着重于速度. Github: https://github.com ...
- jmeter利用自身代理录制电脑脚本(一)
在利用代理录制脚本时一定要安装java jdk,不然不能录制的. 没有安装过java jdk安装jmeter后打开时会提示安装jdk,但是mac系统中直接打开提示安装jdk页面后下载的java并不是j ...
- Python 字符串大小写转换
以下代码演示了如何将字符串转换为大写字母,或者将字符串转为小写字母等: # Filename : test.py # author by : www.runoob.com str = "ww ...
- Python中从SQL型数据库读写dataframe型数据
Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...
- scrapy顺序执行多个爬虫
# -*- coding:utf-8 -*- from scrapy import cmdline from scrapy.cmdline import execute import sys,time ...
- html总结01
lesson01~lesson02基础 <!DOCTYPE html> <html lang="en"> <!-- ################# ...
- man.go 阅读笔记
import ( "flag" "fmt" "github.com/Sirupsen/logrus" &qu ...
- Dubbo中订阅和通知解析
Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中. 2345678910111213141516171819 public <T> ...
- C++中的4种类型转换方式
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...