.NET Core部署中你不了解的框架依赖与独立部署

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html
NET Core项目发布的时候你有没有注意到这两个选项呢?有没有纠结过框架依赖与独立部署到底有什么区别呢?如果有的话那么这篇文章可以参考下!
为什么要写这篇文章呢?因为今天同事问我框架依赖与独立部署到底应该选哪个呢?有什么区别。印象中只知道框架依赖发布后文件比独立部署要小很多,然后就是独立部署不占用net core的共享资源,而框架依赖需要与其他net core程序共享net core的一些资源。感觉很模糊,所以查了下资料整理如下,希望对大家有所帮助。

依赖框架的部署 (FDD)

定义

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

优点

  • 不需要提前定义 .NET Core 应用将在其上运行的目标操作系统。 因为无论什么操作系统,.NET Core 的可执行文件和库都是用通用的 PE 文件格式,因此,无论什么基础操作系统,.NET Core 都可执行应用。

  • 部署包很小。 只需部署应用及其依赖项,而无需部署 .NET Core 本身。

  • 许多应用都可使用相同的 .NET Core 安装,从而降低了主机系统上磁盘空间和内存使用量。

    缺点

  • 仅当主机系统上已安装你设为目标的 .NET Core 版本或更高版本时,应用才能运行。

  • 如果不了解将来版本,.NET Core 运行时和库可能发生更改。 在极少数情况下,这可能会更改应用的行为。

独立部署 (SCD)

定义

独立部署:与 FDD 不同,独立部署 (SCD) 不依赖目标系统上存在的共享组件。 所有组件(包括 .NET Core 库和 .NET Core 运行时)都包含在应用程序中,并且独立于其他 .NET Core 应用程序。 SCD 包括一个可执行文件(如 Windows 平台上名为 app 的应用程序的 app.exe),它是特定于平台的 .NET Core 主机的重命名版本,还包括一个 .dll 文件(如 app.dll),而它是实际的应用程序。
对于独立部署,可以部署应用和所需的第三方依赖项以及生成应用所使用的 .NET Core 版本。 创建 SCD 不包括各种平台上的 .NET Core 本机依赖项,因此运行应用前这些依赖项必须已存在。
从 NET Core 2.1 SDK(版本 2.1.300)开始,.NET Core 支持修补程序版本前滚。 在创建独立部署时,.NET Core 工具会自动包含你的应用程序所指向的 .NET Core 版本的最新服务的运行时。 (最新服务的运行时包括安全修补程序和其他 bug 修复程序。)服务的运行时不需要存在于你的生成系统上;它会从 NuGet.org 自动下载。
FDD 和 SCD 部署使用单独的主机可执行文件,使你可以使用发布者签名为 SCD 签署主机可执行文件。

优点

  • 可以对与应用一起部署的 .NET Core 版本具有单独的控制权

  • 请放心,目标系统可以运行你的 .NET Core 应用,因为你提供的是应用将在其上运行的 .NET Core 版本

    缺点

  • 由于 .NET Core 包含在部署包中,因此必须提前选择为其生成部署包的目标平台

  • 部署包相对较大,因为需要将 .NET Core 和应用及其第三方依赖项包括在内。

    从.NET Core 2.0 开始,可以通过使用 .NET Core 全球化固定模式在 Linux 系统上减少大约 28 MB 的部署大小。 通常,Linux 上的 .NET Core 依赖于 ICU 库来实现全球化支持。 在固定模式下,库不包含在部署中,并且所有区域性的行为均类似于固定区域性。

  • 向系统部署大量独立的 .NET Core 应用可能会使用大量磁盘空间,因为每个应用都会复制 .NET Core 文件

实例演示 .NET Core 应用的部署发布

上面已经说了,可以将 .NET Core 应用程序部署为依赖框架的部署或独立部署,前者包含应用程序二进制文件,但依赖目标系统上存在的 .NET Core,而后者同时包含应用程序和 .NET Core 二进制文件。

不包含第三方依赖的框架依赖的部署

  1. 为项目创建一个目录,并将其设为当前目录

  2. 在命令行中,键入 dotnet new console 以创建新的 C# 控制台项目

  3. 在编辑器中打开 Program.cs 文件,然后使用下列代码替换自动生成的代码。 它会提示用户输入文本,并显示用户输入的个别词。 它使用正则表达式 \w+ 来将输入文本中的词分开。

640?wx_fmt=png

  1. 运行 dotnet restore(请参阅注释)命令,还原项目中指定的依赖项。

  2. 使用 dotnet build命令生成应用程序,或使用 dotnet run命令生成并运行应用程序。

  3. 完成程序调试和测试后,使用下列命令创建部署

    dotnet publish -f netcoreapp2.1 -c Release

    这将创建一个应用的发行版(而不是调试版)。 生成的文件位于名为“publish”的目录中,该目录位于项目的 bin 目录的子目录中。

    与应用程序的文件一起,发布过程将发出包含应用调试信息的程序数据库 (.pdb) 文件。 该文件主要用于调试异常。 可以选择不将其与应用程序的文件一起分布。 但是,如果要调试应用的发布版本,则应保存该文件。

    可以采用任何喜欢的方式部署完整的应用程序文件集。 例如,可以使用简单的 copy 命令将其打包为 Zip 文件,或者使用选择的安装包进行部署。

  4. 安装成功后,用户可通过使用 dotnet 命令或提供应用程序文件名(如 dotnet fdd.dll)来执行应用程序。
    除应用程序二进制文件外,安装程序还应捆绑共享框架安装程序,或在安装应用程序的过程中将其作为先决条件进行检查。 安装共享框架需要管理员/根访问权限。

包含第三方依赖项的依赖框架的部署

要使用一个或多个第三方依赖项来部署依赖框架的部署,需要这些依赖项都可供项目使用。 在运行 dotnet restore命令之前,还需执行额外两个步骤:

  1. 向 csproj 文件的 

    部分添加对所需第三方库的引用。 以下 部分包含 Json.NET 的依赖项(作为第三方库):
<ItemGroup><PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
</ItemGroup>
  1. 如果尚未安装,请下载包含第三方依赖项的 NuGet 包。 若要下载该包,请在添加依赖项后执行 dotnet restore命令。 因为依赖项在发布时已从本地 NuGet 缓存解析出来,因此它一定适用于你的系统。

    请注意,如果依赖框架的部署具有第三方依赖项,则其可移植性只与第三方依赖项相同。 例如,如果某个第三方库只支持 macOS,该应用将无法移植到 Windows 系统。 当第三方依赖项本身取决于本机代码时,也可能发生此情况。 Kestrel 服务器就是一个很好的示例,它需要 libuv 的本机依赖项。 当为具有此类第三方依赖项的应用程序创建 FDD 时,已发布的输出会针对每个本机依赖项支持(存在于 NuGet 包中)的运行时标识符 (RID) 包含一个文件夹。

不包含第三方依赖项的独立部署

部署没有第三方依赖项的独立部署包括创建项目、修改 csproj 文件、生成、测试以及发布应用。 一个用 C# 编写的简单示例可说明此过程。 该示例演示如何使用命令行中的 dotnet 实用工具创建独立部署。

  1. 为项目创建一个目录,并将其设为当前目录。

  2. 在命令栏行中,键入 dotnet new console,在该目录中创建新的 C# 控制台项目

  3. 在编辑器中打开 Program.cs 文件,然后使用下列代码替换自动生成的代码。 它会提示用户输入文本,并显示用户输入的个别词。 它使用正则表达式 \w+ 来将输入文本中的词分开。

640?wx_fmt=png

  1. 在 csproj 文件(该文件用于定义应用的目标平台)的 

    部分中创建 标记,然后指定每个目标平台的运行时标识符 (RID)。 请注意,还需要添加分号来分隔 RID。 请查看运行时标识符目录,获取运行时标识符列表。
    例如,以下 部分表明应用在 64 位 Windows 10 操作系统和 64 位 OS X 10.11 版本的操作系统上运行。
<PropertyGroup><RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers></PropertyGroup>

请注意, 元素可能出现在 csproj 文件的任何 中。 本节后面部分将显示完整的示例 csproj 文件。

  1. 运行 dotnet restore命令,还原项目中指定的依赖项。

  2. 运行 dotnet restore(请参阅注释)命令,还原项目中指定的依赖项。特别是如果应用面向 Linux,则可以通过利用全球化固定模式来减小部署的总规模。 全球化固定模式适用于不具有全局意识且可以使用固定区域性的格式约定、大小写约定以及字符串比较和排序顺序的应用程序。要启用固定模式,右键单击“解决方案资源管理器”中的项目(不是解决方案),然后选择“编辑 SCD.csproj”。 然后将以下突出显示的行添加到文件中:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp2.1</TargetFramework></PropertyGroup><ItemGroup><RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" /></ItemGroup> </Project>
  1. 在命令行中,使用 dotnet run 生成命令。

  2. 调试并测试程序后,为应用的每个目标平台创建要与应用一起部署的文件。
    同时对两个目标平台使用 dotnet publish 命令,如下所示:

dotnet publish -c Release -r win10-x64dotnet publish -c Release -r osx.10.11-x64

这将为每个目标平台创建一个应用的发行版(而不是调试版)。 生成的文件位于名为“发布”的子目录中,该子目录位于项目的 .\bin\Release\netcoreapp2.1 子目录的子目录中。 请注意,每个子目录中都包含完整的启动应用所需的文件集(既有应用文件,也有所有 .NET Core 文件)。

与应用程序的文件一样,发布过程将生成包含应用调试信息的程序数据库 (.pdb) 文件。 该文件主要用于调试异常。 可以选择不使用应用程序文件打包该文件。 但是,如果要调试应用的发布版本,则应保存该文件。
可按照任何喜欢的方式部署已发布的文件。 例如,可以使用简单的 copy 命令将其打包为 Zip 文件,或者使用选择的安装包进行部署。
下面是此项目完整的 csproj 文件。

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp2.1</TargetFramework><RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers></PropertyGroup></Project>

包含第三方依赖项的独立部署

部署包含一个或多个第三方依赖项的独立部署包括添加依赖项。 在运行 dotnet restore命令之前,还需执行额外两个步骤:

  1. 将对任何第三方库的引用添加到 csproj 文件的 

    部分。 以下 部分使用 Json.NET 作为第三方库。
<ItemGroup><PackageReference Include="Newtonsoft.Json" Version="10.0.2" /></ItemGroup>
  1. 如果尚未安装,请将包含第三方依赖项的 NuGet 包下载到系统。 若要使依赖项对应用适用,请在添加依赖项后执行 dotnet restore命令。 因为依赖项在发布时已从本地 NuGet 缓存解析出来,因此它一定适用于你的系统。
    下面是此项目的完整 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp2.1</TargetFramework><RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="10.0.2" /></ItemGroup></Project>

部署应用程序时,应用中使用的任何第三方依赖项也包含在应用程序文件中。 运行应用的系统上不需要第三方库。
请注意,可以只将具有一个第三方库的独立部署部署到该库支持的平台。 这与依赖框架的部署中具有本机依赖项和第三方依赖项相似,其中的本机依赖项必须与部署应用的平台兼容。

备注:
从 .NET Core 2.0 开始,无需运行 dotnet restore,因为它由所有需要还原的命令隐式运行,如 dotnet newdotnet build 和 dotnet run

总结

本文首先介绍了框架依赖与独立部署的概念,然后分别介绍了框架依赖与独立部署的优缺点让大家加深理解!最后通过一个实例来讲述了如何进行框架依赖与独立部署。采用的实例使用的是控制台的方式进行的,当然你也可以使用vs进行发布。

原文地址: https://www.cnblogs.com/yilezhu/p/9703460.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dump文件解析之探索.Net的内存

前言&#xff1a;对于需要长时间运行的.net程序&#xff0c;有时需要我们查看内存的使用有没有内存泄露问题。我们可以从dump文件中找到答案。Dump的看点用dump文件来分析内存&#xff0c;到底我们需要关心哪些点呢&#xff1f;内存的使用情况 HeapSize/object的数量 也就是托管…

微软发布Azure Pipelines,开源项目可无限制使用CI/CD

微软发布了Azure Pipelines&#xff0c;他们新的CI/CD服务&#xff0c;是Azure DevOps产品的一部分。Azure Pipelines可用于构建、测试和部署工作负载&#xff0c;并可以让各种语言、项目类型和平台协同工作。作为Visual Studio Team Services&#xff08;VSTS&#xff09;的后…

2020牛客暑期多校训练营(第一场)

文章目录A B-Suffix ArrayB Infinite TreeC DominoD Quadratic FormE Counting Spanning TreesF Infinite String Comparision题意&#xff1a;题解&#xff1a;代码&#xff1a;G BaXianGuoHai, GeXianShenTongH Minimum-cost FlowI 1 or 2J Easy Integration题意题解代码2020…

C# 接受MQTT服务器推送的消息

前言&#xff1a;MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议&#xff0c;采用轻量级发布和订阅消息传输机制。大家可以直接上GitHub下载MQQT服务的源码&#xff0c;源码地址&#xff1a;https://github.com/mqtt/mqtt.github.io/wiki/libraries主要内容…

Boundary(2020多校第二场B)

Boundary&#xff08;2020多校第二场B&#xff09; 文章目录题意&#xff1a;题解&#xff1a;思路1&#xff1a;代码&#xff1a;思路二代码题意&#xff1a; 坐标平面有n个点&#xff08;不与原点&#xff08;0,0&#xff09;重复&#xff09;,现考虑一个圆&#xff0c;&…

.NET Core开发日志——Linux版本的SQL Server

SQL Server 2017版本已经可以在Linux系统上安装&#xff0c;但我在尝试.NET Core跨平台开发的时候使用的是Mac系统&#xff0c;所以这里记录了在Mac上安装SQL Server的过程。最新的SQL Server没有专门为Mac系统准备安装包&#xff0c;但由于Mac系统上支持Docker&#xff0c;所以…

【倍增】【线段树】雨林跳跃(luogu 7599[APIO 2021 T2])

正题 luogu 7599[APIO 2021 T2] 题目大意 给你一排树中每棵树的高度&#xff0c;每次跳跃可以跳到左/右边第一棵比该树高的树&#xff0c;问你从A-B中某棵树跳到C-D中的某棵树的最小步数&#xff08;A⩽B<C⩽DA\leqslant B< C\leqslant DA⩽B<C⩽D&#xff09; 解题…

dotnetClub 的前世今生

三年之前&#xff0c;我做过一个在线调查&#xff0c;当时有不少人还是对一个在线社区表示出期待。.NET Core 技术正风声水起&#xff0c;所以我就开始了用它来开发一个论坛的计划。最近正式将项目推动到了一个 MVP 的状态。感兴趣的朋友&#xff0c;现在可以访问 preview.dotn…

【每日一题】7月13日题目精讲—Kingdom

【每日一题】7月13日题目精讲—Kingdom 文章目录题目描述题解&#xff1a;代码:时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 1048576K&#xff0c;其他语言2097152K 64bit IO Format: %lld题目描述 X王国有n位官员&#xff0c;编号从1到n。国…

CanalSharp-mysql数据库binlog的增量订阅消费组件Canal的.NET客户端

一.前言CanalSharp是阿里巴巴开源项目mysql数据库binlog的增量订阅&消费组件 Canal 的.NET客户端&#xff0c;关于什么是 Canal&#xff1f;又能做什么&#xff1f;我会在后文为大家一一介绍。CanalSharp 这个项目&#xff0c;是由我和 WithLin(主要贡献) 完成&#xff0c;…

【每日一题】7月14日题目精讲—压缩

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给一个由小写字母组成的字符串&#xff0c;我们可以用一种简单的方法来压缩其中的重复…

【DevOps+LIVE】直播复盘 – DevOps能力成长模型2018首发

昨天晚上小编和DevOpsDays中国核心组织者刘征老师和张乐老师一起嗨了一把&#xff0c;本来规划进行1小时的直播结果延长到了2个小时才结束&#xff0c;观众人数在前半段一直处于增长状态&#xff0c;直到开播一小时到达顶峰。小伙伴也非常给力&#xff0c;一共提出了40多个问题…

Emit动态代理.NetCore迁移之旅

前言】前面我们介绍了Aop 从静态代理到动态代理&#xff1a;https://www.cnblogs.com/7tiny/p/9657451.html我们在.NetFramework平台下使用微软提供的Emit技术实现了动态代理类的生成。但是.NetCore作为微软.Net平台的春天&#xff0c;如果类库光支持.NetFramework&#xff0c;…

asp.net core结合Gitlab-CI实现自动化部署

一、前言在之前的文章中写过k8sJenkinsGitLab-自动化部署asp.net core项目 的topic&#xff0c;这次讲解一下gitlab-ci的CI/CD&#xff0c;说实话&#xff0c;自动化部署是在是非常的舒服&#xff0c;而且gitlab-ci很适合中小项目的部署&#xff0c;大项目推荐使用k8s。阅读目录…

[译]ABP vNext介绍

译者注ASP.NET Boilerplate是.Net平台非常优秀的一个开源Web应用程序框架,在国内也有大量的粉丝.近日, 本人在github上闲逛, 发现ASP.NET Boilerplate团队又悄悄的建立了一个新项目: ABP vNext从名称可以看出来, 这是ASP.NET Boilerplate的下一代框架. 那么, 为什么要开发这个新…

【KMP】重复子串(ybtoj KMP-2)

正题 ybtoj KMP-2 题目大意 问你一个字符串最多由多少个相同的字符串组合而成 解题思路 如下图&#xff0c;先用KMP求出nx数组&#xff0c;那么有1∼nxn1\sim nx_n1∼nxn​和(n−nxn)∼n(n-nx_n)\sim n(n−nxn​)∼n相匹配 不难推出1∼(n−nxn)1\sim (n-nx_n)1∼(n−nxn​)…

C# 8小特性

对于C# 8&#xff0c;有吸引了大多数注意力的重大特性&#xff0c;如默认接口方法和可空引用&#xff0c;也有许多小特性被考虑在内。本文将介绍几例可能加入C#未来版本的小特性。新的赋值运算符&#xff1a;&&和||从第一个版本开始&#xff0c;C#就支持把等号和另外一…

【KMP】周期长度和(luogu 3435/ybtoj KMP-3)

正题 luogu 3435 ybtoj KMP-3 题目大意 定义S的proper前缀为S中非空且len<|S|的前缀&#xff0c;若Q是A的proper前缀&#xff0c;且A是QQ的前缀 现在问你字符串S所有前缀的最大周期之和 解题思路 如上图&#xff0c;对于一个字符串S&#xff0c;如果有周期Q&#xff0c;那…

dotnet core 开发无缝兼容Http和Websocket协议的接口服务

在应用接口开发中往往要针对不同协义开发相应的代理服务&#xff0c;但对于Websocket和http这两种协议来说就有些不同&#xff0c;从实现上来看Websocket可以说是Http的升级子协议&#xff0c; 两者在协议处理上基本一致&#xff0c;具体可以在解释Body上有所不同。FastHttpApi…

centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用。当然&#xff0c;在真实的产线环境中需要分析的数据和难度远远高于demo所示&#xff0c;所以demo的作用也仅仅只能起到介绍工具的作用。通常正常情况下&#xff0c;分析个几天才能得出一个结论的的结果都还是比较…