.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進行發佈。

相關文章
相關標籤/搜索