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

做者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9703460.htmlhtml

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 应用程序的默认部署模型。c#

优势

  • 不须要提早定义 .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 版本app

    缺点

  • 因为 .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+ 来将输入文本中的词分开。

    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String s = Console.ReadLine();
                ShowWords(s);
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
  4. 运行 dotnet restore(请参阅注释)命令,还原项目中指定的依赖项。

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

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

    dotnet publish -f netcoreapp2.1 -c Release

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

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

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

  7. 安装成功后,用户可经过使用 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+ 来将输入文本中的词分开。
using System;
using System.Text.RegularExpressions;

namespace Applications.ConsoleApps
{
    public class ConsoleParser
    {
        public static void Main()
        {
            Console.WriteLine("Enter any text, followed by <Enter>:\n");
            String s = Console.ReadLine();
            ShowWords(s);
            Console.Write("\nPress any key to continue... ");
            Console.ReadKey();
        }

        private static void ShowWords(String s)
        {
            String pattern = @"\w+";
            var matches = Regex.Matches(s, pattern);
            if (matches.Count == 0)
            {
                Console.WriteLine("\nNo words were identified in your input.");
            }
            else
            {
                Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                for (int ctr = 0; ctr < matches.Count; ctr++)
                {
                    Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                }
            }
        }
    }
}
  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-x64
dotnet 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 builddotnet run

总结

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

相关文章
相关标签/搜索